Mat*_*ekk 1 c++ gtk jpeg image-processing gdkpixbuf
使用GTK + 3.6我想从内存中的缓冲区显示图像,而不是磁盘上的文件.我有一个const char *data图像数据,我正在尝试从它创建一个GTK图像.到目前为止,我已经尝试了两种我认为可行的方法.两者都使用GdkPixbuf,因此需要图像数据guchar* (unsigned char*).
有了这个要求,我必须投射数据:
guchar *gudata = reinterpret_cast<guchar*>(const_cast<char*>(data));
Run Code Online (Sandbox Code Playgroud)
然后我尝试了以下内容:
将数据写入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);
}
Run Code Online (Sandbox Code Playgroud)
编辑03/01/2013:从写入函数中删除了stride参数 - 错误打印.
开罗表面不起作用.显示黑屏和噪音.
初始化pixbuf gdk_pixbuf_new_from_data然后图像看起来像电视噪声,这表明数据是错误的(并且已经被转换),或者其他参数是错误的(图像行步幅,但它不是:)).
之后的错误我只是想将数据写入到文件中foo.jpg使用ofstream,是的,我得到一个正常的图像文件.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);
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;
}
Run Code Online (Sandbox Code Playgroud)
原答案:
这里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命令中运行并验证JPEG是否存在,检查您是否安装了用于安装jpg的pixbuf加载程序.
| 归档时间: |
|
| 查看次数: |
7128 次 |
| 最近记录: |