使用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文件格式(它是,下面解释)。编辑:A bit of code:
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%sn", error->message); }
编辑03/01/2013:从write函数中删除了stride参数-打印错误。
Cairo曲面不能很好地工作。显示黑屏和杂音
用
gdk_pixbuf_new_from_data
初始化pixbuf,然后图像看起来像电视噪声,这将表明数据是错误的(并且它已经被转换),或者其他参数是错误的(图像行跨距,但它不是:))。
错误后,我刚刚尝试使用ofstream
将数据写入文件foo.jpg
,是的,我得到了一个正常工作的图像文件。终端中的file
命令确认它是一个JPEG图像,并且使用一个简单的代码块,我已经从该foo.jpg创建了一个GdkPixbuf,以检查它的行跨距值,并且它与我传递给上述函数的值相匹配。
图像数据是否会因强制转换而损坏,如果是,我该如何解决这个问题?我得到const char*
中的图像数据。我看过QtPixmap,它也加载unsigned char*
。
我需要使用一个单独的库吗?(libjpeg ?)我已经安装了libgtk3-dev
谢谢!
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);
gdk_pixbuf_loader_close(loader, 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是否存在。