繁体   English   中英

无法使用gdk_pixbuf_loader加载TIFF图像

[英]unable to load TIFF images using gdk_pixbuf_loader

我等待将图像从内存(jpeg和tiff)加载到gdk_pixbuf_loader_write()中。 我有可以很好地加载jpeg但无法显示tiff图像的示例/测试代码。 蒂夫图像可以与其他观众(侏儒之眼等)很好地打开,因此蒂夫有效。 我还使用imagemagick从jpeg创建了tiff,这些也无法在我的示例代码中加载/显示。

在带有tiff图像的示例代码上运行strace,我可以看到gdkpixbuf加载程序打开了:

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;
}

我正在为我们的条形码扫描仪驱动程序开发一个演示应用程序的示例。 所以我也遇到这个问题。 通过在调用“ gdk_pixbuf_loader_get_pixbuf”之前关闭pixbuffer,我设法解决了这个问题

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

同样最好检查if (pixbuf == NULL ){以避免空指针导致崩溃。

在“ tiff”中,您需要调用gdk_pixbuf_loader_close,否则它将不起作用。 而且,当您关闭它时,您不能再次使用相同的加载器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM