【发布时间】:2013-01-02 11:22:59
【问题描述】:
使用 GTK+ 3.6 我想显示来自内存缓冲区的图像,而不是磁盘上的文件。我有一个带有图像数据的const char *data,我正在尝试从中创建一个 GTK 图像。
到目前为止,我已经尝试了两种我认为可行的方法。两者都使用 GdkPixbuf,因此要求图像数据为guchar* (unsigned char*)。
根据这个要求,我必须转换数据:
guchar *gudata = reinterpret_cast<guchar*>(const_cast<char*>(data));
然后我尝试了以下方法:
-
使用
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); }编辑 2013 年 3 月 1 日: 从 write 函数中删除了 stride 参数 - 打印错误。
开罗表面效果不佳。显示黑屏和噪音。
使用
gdk_pixbuf_new_from_data初始化pixbuf,然后图像看起来像电视噪音,这表明数据错误(并且已被投射),或者其他参数错误(图像行大步前进,但不是:))。
发生错误后,我只是尝试使用ofstream 将数据写入文件foo.jpg,是的,我得到了一个正常工作的图像文件。终端中的 file 命令确认它是 JPEG 图像,并且通过一个简单的代码块,我从该 foo.jpg 创建了一个 GdkPixbuf 以检查它的行步幅值,它与我传递给上述的值相匹配功能。
图像数据是否会因演员表而损坏,如果是,我该如何解决?我在const char* 中获取图像数据。我查看了 QtPixmap,它还加载了unsigned char*。
我需要使用单独的库吗? (libjpeg?) 我已经安装了 libgtk3-dev。
谢谢!
【问题讨论】:
标签: c++ image-processing gtk jpeg gdkpixbuf