2

使用 GTK+ 3.6 我想显示来自内存缓冲区的图像,而不是磁盘上的文件。我有一个const char *data图像数据,我正在尝试从中创建一个 GTK 图像。到目前为止,我已经尝试了两种我认为可行的方法。两者都使用 GdkPixbuf,因此要求图像数据为guchar* (unsigned char*).

有了这个要求,我必须转换数据:

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

然后我尝试了以下方法:

  1. gdk_pixbuf_loader_write使用.将数据写入 GdkPixbufLoader 在这里我收到一个错误"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); 
    }
    

    编辑 03/01/2013:从写入函数中删除了步幅参数 - 打印错误。

    开罗表面也不能正常工作。显示黑屏和噪音。

  2. 初始化 pixbuf,gdk_pixbuf_new_from_data然后图像看起来像电视噪声,这表明数据错误(并且它已被投射),或者其他参数错误(图像行步幅,但不是 :))。

foo.jpg出现错误后,我只是尝试使用将数据写入文件ofstream,是的,我得到了一个正常工作的图像文件。终端中的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 *或这里的unsigned char *重要性不大。

gdk_pixbuf_new_from_data只会读取带有 alpha 通道 (RGBA) 或不带 (RGB) 的未压缩 RGB 数据(支持的唯一色彩空间是 GDK_COLORSPACE_RGB)。难怪通过它JPEG失败。

调用gdk_pixbuf_loader_write看起来是一个更好的选择,但我们需要一些代码来查看您可能做错了什么。但是,通过在 shell 中运行命令来检查您是否安装了 jpg 的 pixbuf 加载程序gdk-pixbuf-query-loaders,并验证 JPEG 是否存在。

于 2013-01-02T13:44:00.483 回答