2016-02-07 117 views
1

我等待将图像从内存(jpegs和tiffs)加载到gdk_pixbuf_loader_write()中。我有加载jpeg的样本/测试代码很好,但无法显示tiff图像。 tiff图像与其他观众(gnome等的眼睛)打开很好,所以tiff是有效的;我也使用imagemagick从jpegs创建tiff,这些也无法加载/显示在我的示例代码中。无法使用gdk_pixbuf_loader加载TIFF图像

在我的示例代码在后台运行strace与TIFF图像,我可以看到gdkpixbuf装载机OK打开:

open("/usr/lib64/gdk-pixbuf-2.0/2.10.0/loaders.cache", O_RDONLY) = 7 
... 
open("/usr/lib64/gdk-pixbuf-2.0/2.10.0/loaders/libpixbufloader-tiff.so", O_RDONLY|O_CLOEXEC) = 7 

有没有什么具体的,我需要用TIFF文件的时候处理?样本测试程序如下。

#include <sys/types.h> 
#include <sys/stat.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

#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; 
    struct stat st; 

    guint8* buffer = NULL; 
    gsize length = 0; 
    GdkPixbufLoader *loader = NULL; 
    GdkPixbuf *pixbuf; 
    GtkWidget *window; 
    GtkWidget *image; 
    GError** err_ = NULL; 

    if (argc == 1) { 
     printf("no files\n"); 
    exit(1); 
    } 
    memset(&st, sizeof(st), 0); 
    stat(argv[1], &st); 
    if (st.st_size == 0) { 
     printf("%s is empty\n", argv[1]); 
    exit(1); 
    } 

    buffer = malloc(st.st_size); 
    memset(buffer, 0, st.st_size); 

    gtk_init (&argc, &argv); 

    f = fopen (argv[1], "rb"); 
    if ((length = fread (buffer, 1, st.st_size, f)) != st.st_size) { 
     printf("failed to read all data from %s\n", argv[1]); 
    exit(1); 
    } 
    fclose (f); 

    if (argc == 3) { 
     printf("requesting loader for mimetype=%s on %s\n", argv[2], argv[1]); 
     loader = gdk_pixbuf_loader_new_with_mime_type(argv[2], err_); 
     if (err_ && *err_) { 
      g_error_free(*err_); 
      *err_ = NULL; 
      printf("no known loader for explicit mimetype, defaulting\n"); 
      loader = gdk_pixbuf_loader_new(); 
     } 
    } 
    else 
    { 
     loader = gdk_pixbuf_loader_new(); 
    } 
    gdk_pixbuf_loader_write (loader, buffer, length, NULL); 
    pixbuf = gdk_pixbuf_loader_get_pixbuf (loader); 
    gdk_pixbuf_loader_close(loader, err_); 

    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(); 

    free(buffer); 
    return 0; 
} 

回答

0

我正在为我们的条形码扫描仪驱动程序开发示例演示应用程序。所以我也遇到这个问题。我叫“gdk_pixbuf_loader_get_pixbuf”

gdk_pixbuf_loader_close(loader,&error); 
GdkPixbuf* pixbuf = gdk_pixbuf_loader_get_pixbuf(loader); 

也很检查if (pixbuf == NULL){以避免空指针的崩溃是一个好主意之前设法解决这个问题,通过关闭pixbuffer。

在'tiff'中,您需要调用gdk_pixbuf_loader_close,否则它将无法工作。 当你关闭它时,你不能再使用同一个装载器。