2

GTK+ 3.6 を使用して、ディスク上のファイルではなく、メモリ内のバッファから画像を表示したいと考えています。画像データがconst char *dataあり、そこから GTK 画像を作成しようとしています。これまでのところ、うまくいくと思われる2つのアプローチを試しました。どちらも GdkPixbuf を使用するため、画像データをguchar* (unsigned char*).

その要件により、データをキャストする必要があります。

guchar *gudata = reinterpret_cast<guchar*>(const_cast<char*>(data));

次に、次のことを試しました。

  1. でデータを GdkPixbufLoader に書き込みますgdk_pixbuf_loader_write。ここでエラーが発生"Unrecognized image file format"するか、特定のタイプ (jpg) でローダーを作成すると、JPG ファイル形式ではないというエラーが発生します (以下で説明します)。

    編集: コードのビット:

    guchar *gudata = reinterpret_cast<guchar*>(const_cast<char*>(data));
    int stride = ((1056 * 32 + 31) & ~31)/8;
    GdkPixbufLoader *loader = gdk_pixbuf_loader_new();
    GError *error = NULL;
    
    if(!gdk_pixbuf_loader_write(loader, gudata, data_size, &error)
    { 
        printf("Error:\n%s\n", error->message); 
    }
    

    EDIT 03/01/2013: 書き込み関数からストライド パラメータを削除 - ミスプリント。

    カイロ表面も同様に機能しません。黒い画面とノイズが表示されます。

  2. でpixbufを初期化するgdk_pixbuf_new_from_dataと、画像はテレビのノイズのように見えます。これは、データが間違っている(そしてキャストされている)か、他のパラメーターが間違っていることを示します(画像の行ストライドですが、そうではありません:))。

エラーの後、データをファイルに書き込もうとしましたがfoo.jpgofstreamはい、適切に機能する画像ファイルを取得しました。ターミナルのfileコマンドは、それが JPEG 画像であることを確認し、単純なコード ブロックを使用して、その foo.jpg から GdkPixbuf を作成し、その行ストライド値をチェックして、前述の関数に渡す値と一致させます。

画像データはキャストで破損しますか?もしそうなら、どうすればそれに対処できますか? で画像データを取得しconst char*ます。私は QtPixmap を見てきましたが、それもロードされますunsigned char*

別のライブラリを使用する必要がありますか? (libjpeg?) libgtk3-dev をインストールしました。

ありがとうございました!

4

1 に答える 1

7

2012 年 3 月 1 日更新:

これは、その近くにある「test.jpg」ファイルをロードする単純な作業アプリです (ファイル サイズは 100000 バイト未満である必要があります)。

#include <glib.h>
#include <gdk-pixbuf/gdk-pixbuf.h>
#include <gtk/gtk.h>

void on_destroy (GtkWidget *widget G_GNUC_UNUSED, gpointer user_data G_GNUC_UNUSED)
{
    gtk_main_quit ();
}

int main (int argc, char *argv[]) 
{
    FILE *f;
    guint8 buffer[100000];
    gsize length;
    GdkPixbufLoader *loader;
    GdkPixbuf *pixbuf;
    GtkWidget *window;
    GtkWidget *image;

    gtk_init (&argc, &argv);

    f = fopen ("test.jpg", "r");
    length = fread (buffer, 1, sizeof(buffer), f);
    fclose (f);

    loader = gdk_pixbuf_loader_new ();
    gdk_pixbuf_loader_write (loader, buffer, length, NULL);
    pixbuf = gdk_pixbuf_loader_get_pixbuf (loader);

    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    image = gtk_image_new_from_pixbuf (pixbuf);
    gtk_container_add (GTK_CONTAINER (window), image);
    gtk_widget_show_all (GTK_WIDGET (window));
    g_signal_connect (window, "destroy", G_CALLBACK(on_destroy), NULL);
    gtk_main ();

    return 0;
}

元の回答:

char *or unsigned char *here はほとんど重要ではありません。

gdk_pixbuf_new_from_data非圧縮 RGB データ (サポートされている唯一の色空間は GDK_COLORSPACE_RGB) のみを読み取り、アルファ チャネルあり (RGBA) またはアルファ チャネルなし (RGB) を読み取ります。JPEG を渡すと失敗するのも不思議ではありません。

呼び出しgdk_pixbuf_loader_writeはより良いオプションのように見えますが、何が間違っているかを確認するためのコードが必要です. gdk-pixbuf-query-loadersただし、シェルでコマンドを実行し、JPEG があることを確認して、jpg 用の pixbuf ローダーがインストールされていることを確認してください。

于 2013-01-02T13:44:00.483 に答える