使用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:从write函数中删除了stride参数-印刷错误。
Cairo表面也不起作用。显示黑屏和噪音。
1.用gdk_pixbuf_new_from_data
初始化pixbuf,然后图像看起来就像电视噪声,这表明数据是错误的(它已经被投射),或者其他参数是错误的(图像行步幅,但它不是:))。
错误后,我只是尝试使用ofstream
将数据写入文件foo.jpg
,是的,我得到了一个正常工作的图像文件。terminal中的file
命令确认它是一个JPEG图像,并且通过一个简单的代码块,我已经从该foo.jpg创建了一个GdkPixbuf来检查它的行步幅值,它与我传递给上述函数的值相匹配。
图像数据是否会随着转换而损坏,如果是,我该如何解决这个问题?我在const char*
中获取图像数据。我看过QtPixmap,它也加载了unsigned char*
。
我需要使用一个单独的图书馆吗?(libjpeg?)我安装了libgtk 3-dev。
谢谢大家!
1条答案
按热度按时间zqdjd7g91#
03/01/2012更新:
这里有一个简单的工作应用程序,它加载了一个“test.jpg”文件(文件大小必须小于100000字节)。
原始答案:
这里的
char *
或unsigned char *
并不重要。gdk_pixbuf_new_from_data
将仅读取带Alpha通道(RGBA)或不带Alpha通道(RGB)的未压缩RGB数据(支持的唯一颜色空间是GDK_COLORSPACE_RGB)。难怪JPEG会失败。调用
gdk_pixbuf_loader_write
看起来是一个更好的选择,但我们需要一些代码来查看您可能做错了什么。但是,通过在shell中运行gdk-pixbuf-query-loaders
命令并验证JPEG是否存在,检查是否安装了jpg的pixbuf加载器。