Невозможно загрузить изображения TIFF с помощью gdk_pixbuf_loader
Я жду, чтобы загрузить изображения из памяти (jpegs и tiffs) в gdk_pixbuf_loader_write(). У меня есть пример / тестовый код, который загружает JPEG просто отлично, но не отображает изображения TIFF. Изображения TIFF прекрасно открываются для других зрителей (глаз гнома и т. Д.), Поэтому TIFF действителен; Я также использовал imagemagick для создания tiff-файлов из jpegs, и их также не удается загрузить / отобразить в моем примере кода.
Запустив strace в моем примере кода с изображением tiff, я вижу, что загрузчик 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;
}
1 ответ
Я разрабатываю пример демонстрационного приложения для нашего драйвера сканера штрих-кода. Так что я тоже сталкиваюсь с этой проблемой. Мне удалось решить эту проблему, закрыв pixbuffer перед вызовом 'gdk_pixbuf_loader_get_pixbuf'
gdk_pixbuf_loader_close(loader,&error);
GdkPixbuf* pixbuf = gdk_pixbuf_loader_get_pixbuf(loader);
также это хорошая идея, чтобы проверить if (pixbuf == NULL ){
чтобы избежать сбоев с нулевыми указателями.
В 'tiff' вам нужно вызвать gdk_pixbuf_loader_close, иначе это не будет работать. И когда вы закроете его, вы не сможете снова использовать тот же загрузчик.