2013-01-02 44 views
1

使用GTK + 3.6我想從內存中的緩衝區顯示圖像,而不是磁盤上的文件。我有一個const char *data與圖像數據,我試圖從它創建一個GTK圖像。 到目前爲止,我嘗試了兩種我認爲可以工作的方法。兩者都使用GdkPixbuf,因此要求圖像數據爲guchar* (unsigned char*)Gdk pixbuf從內存加載圖像

這一要求我必須投中的數據:

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); 
    } 
    

    編輯2013年3月1日:從寫功能 刪除步幅參數 - 印刷錯誤。

    開羅表面不起作用。顯示黑屏和噪音。

  2. 初始化與gdk_pixbuf_new_from_data的pixbuf的,然後將圖像看起來就像電視噪音,這表明要麼該數據是錯誤的(並已投),或者其他參數是錯誤的(圖像的行了事,但是不是 :) )。

後,我只是想將數據寫入到使用ofstream文件foo.jpg錯誤,是的,我得到一個正常的圖像文件。終端中的file命令確認它是一個JPEG圖像,並且通過一段簡單的代碼塊,我從該foo.jpg創建了一個GdkPixbuf,以檢查它的行跨度值,並且它與我傳遞給上述函數的值相匹配。

圖像數據是否成爲腐敗跟投,如果是這樣我怎麼能解決?我在const char*中獲取圖像數據。我看過QtPixmap,它也加載unsigned char*

我需要使用單獨的庫嗎? (libjpeg?) 我已安裝libgtk3-dev。

謝謝!

回答

5

03/01/2012更新:

下面是加載在它附近一個「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 *unsigned char *這裏意義不大。

gdk_pixbuf_new_from_data將只讀取未壓縮的RGB數據(所支持的色彩空間僅是GDK_COLORSPACE_RGB)帶有alpha通道(RGBA)或不用它(RGB)。難怪通過JPEG失敗。

調用gdk_pixbuf_loader_write看起來像一個更好的選擇,但我們需要一些代碼,看看是否做錯了什麼。然後檢查你是否已經通過在shell中運行的gdk-pixbuf-query-loaders命令安裝了用於jpg的pixbuf加載程序,並驗證JPEG是否存在。

+0

我跑'GDK-pixbuf的查詢,loaders'和JPEG安裝。另外,我將編輯該問題以包含一些代碼。 – Matekk

+1

爲什麼不使用gdk_pixbuf_new_from_stream和GMemoryInputStream? – ergosys

+0

不幸的是,我得到「無法識別的圖像文件格式」。再次,如果我只是將相同的數據流寫入文件,會導致正常工作的.jpg圖像。 – Matekk