GdkPixbuf возвращает gi._glib.GError: Не удалось распознать формат файла изображения

У меня проблема с загрузкой изображений PNG в Gtk3. Я сломал символы изображения в своих ToolButtons, и после некоторого расследования выяснилось, что это происходит из-за того, что GdkPixbuf не может читать файлы PNG.

Я воспроизвел проблему с консолью python

>>> from gi.repository import GdkPixbuf
>>> print(GdkPixbuf)
<gi.module.DynamicModule 'GdkPixbuf' from '/home/user1/ctcils/dusserm/applications/gobject-introspection/1.40.0/lib/girepository-1.0/GdkPixbuf-2.0.typelib'>
>>> GdkPixbuf.Pixbuf.new_from_file("/home/user1/ctcils/dusserm/applications/pycharm-community-3.4.1/bin/pycharm.png")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
gi._glib.GError: Couldn't recognize the image file format for file '/home/user1/ctcils/dusserm/applications/pycharm-community-3.4.1/bin/pycharm.png'

Многие из проблем, с которыми я столкнулся в последние дни, были связаны с тем, что нам приходилось компилировать Gtk3, pygobject и все их зависимости и устанавливать их в нестандартные каталоги. Подозреваю проблему с самоанализом объекта (последний из длинного списка).


person Michael Dussere    schedule 04.08.2014    source источник
comment
Как вы собирали и устанавливали эти библиотеки в нестандартные каталоги?   -  person Simon Feltman    schedule 05.08.2014
comment
Я использовал традиционную конфигурацию/make/make install с параметром --prefix. Под нестандартными я просто подразумеваю, что каждая библиотека устанавливается в определенный каталог в NFS (некоторые из них на данный момент установлены в моем домашнем каталоге), а не в общий каталог, такой как /usr/local.   -  person Michael Dussere    schedule 05.08.2014
comment
Кажется, рекомендуется использовать JHbuild, но у нас нет доступа в Интернет на серверах, на которых мы устанавливаем.   -  person Michael Dussere    schedule 05.08.2014


Ответы (3)


Не полный ответ, а несколько советов по отладке: проверьте, какие загрузчики изображений предоставляет gdk-pixbuf (см. также какие форматы изображений поддерживаются Gdk-Pixbuf (Gtk -Изображение?) по умолчанию?). Фрагмент Python, чтобы проверить это:

from gi.repository import GdkPixbuf
for fmt in GdkPixbuf.Pixbuf.get_formats():
    print(fmt.get_extensions())

Если ничего не появляется, gdk-pixbuf не находит никаких загрузчиков, которые, вероятно, как-то связаны с местом установки (параметры конфигурации --prefix и/или --libdir). Убедитесь, что у вас установлены загрузчики в том месте, где gdk-pixbuf ожидает их найти (особенно загрузчик png). Это должно быть что-то вроде: ‹prefix›/lib[64]/gdk-pixbuf-2.0/‹version›/loaders

См. также: https://developer.gnome.org/gdk-pixbuf/stable/gdk-pixbuf-query-loaders.html

person Simon Feltman    schedule 06.08.2014
comment
Вроде все на месте. Pixbuf.get_formats возвращает полный список форматов изображений, содержащих [png]. В gdk-pixbuf-query-loaders есть запись для png, указывающая на местоположение libpixbufloader-png.so. libpixbufloader-png.so находится в каталоге загрузчиков. Я проверил его зависимости с помощью ldd, и он выглядит нормально. Файл загрузчика-кеша на месте. Я безуспешно пытался настроить GDK_PIXBUF_MODULEDIR и LD_LIBRARY_PATH. - person Michael Dussere; 06.08.2014
comment
В моей системе установлено 2 libpng: libpng12.so.0.49.0 и libpng.so.3.49.0. libpixbufloader-png.so зависит от libpng12. Это нормально? Во время настройки я увидел, что он ищет libpng16 в приоритете, а libpng12 был просто запасным вариантом. Может это объяснение? - person Michael Dussere; 06.08.2014
comment
Спасибо за вашу помощь. Знаете ли вы, существует ли реальная зависимость между pixbuf и конкретной версией libpng? - person Michael Dussere; 06.08.2014

Я получил аналогичную ошибку с необычным префиксом и решил ее, установив XDG_DATA_DIRS, который я не устанавливал.

export XDG_DATA_DIRS=.../usr/share

Источник: https://bugs.gentoo.org/644136

person Alexey Sokolov    schedule 26.09.2020

Похоже, проблема была в самой библиотеке PNG. Я очень удивлен, учитывая, что он исходит из обычного об/мин CentOS libpng-1.2.49-1.el6_2.x86_64 и что PNG является стабильным стандартом на века. Кроме того, у нас не было проблем с GTK2, который, я полагаю, использовал ту же библиотеку...

Так или иначе, я собрал новый яркий libpng 1.6.2 из исходников, я перенастроил и переустановил gdk-pixbuf, и теперь он работает.

person Michael Dussere    schedule 06.08.2014
comment
Как ни странно, рад видеть, что вы это поняли. - person Simon Feltman; 06.08.2014