Включение поддержки JPEG для QImage в скриптах, написанных на py2exe?

Я пытаюсь использовать изображение JPEG в объекте QImage из Python script с PyQt4.

Сам script отлично работает, изображение загружается, и его можно манипулировать и визуализировать, и все. Однако, когда я пытаюсь "скомпилировать" этот script с py2exe, все работает, но изображение JPEG. Замена его на эквивалент PNG работает, но поскольку моя программа загружает изображения из Интернета, они не всегда будут в формате PNG, и я не могу позволить себе преобразовать их в другую библиотеку.

Я обнаружил, что поддержка изображений JPEG для QImage наряду с другими форматами изображений предоставляется некоторыми DLL в каталоге \qt\plugins\imagesformats (они называются qjpeg4.dll и qjpeg4d.dll). Я думаю, что мне нужно как-то использовать их в своем исполняемом файле, но я не знаю, как это сделать. Я попробовал просто скопировать их в каталог exe, не повезло. Я пробовал, как указанный здесь, чтобы включить эти файлы в файлы данных в файл setup.py script, но не повезло (похоже все, что он делает, это копирование этих файлов в каталог exe, поэтому он ничего не меняет при копировании вручную).

Я уверен, что там есть несколько приложений, использующих PyQt с изображениями в формате JPEG, как они это делают? Это казалось тривиальной задачей, но я застрял на ней сейчас.

Кроме того, я хочу, чтобы мое приложение было кросс-платформенным (почему еще я буду кодировать в Python?), я надеюсь, что не буду сталкиваться с такими проблемами упаковки (это не единственный) при упаковке для OS X или Linux. Будет ли я?

Ответ 1

После нескольких часов спотыкания с той же проблемой Id хотел бы поделиться решением, которое сработало для меня в Windows Vista: используя python2.6

скопируйте следующий каталог в каталог dist, сгенерированный py2exe:

C:\Python26\Lib\site-packages\PyQt4\plugins\imageformats

Я просто уронил каталог imageformats непосредственно в каталог dist, без каких-либо дополнительных изменений в qt.conf или что-то в этом роде. Я не пробовал это, но это может работать и на фонон.

Ответ 2

Я должен признаться, что мне никогда не удалось получить комбинацию py2exe + pyqt совершенно правильно (и py2exe вообще не помогает с кросс-платформенной упаковкой). PyInstaller выглядит намного лучше - документы http://www.pyinstaller.org/ являются старыми, но svn trunk гораздо более свежий. Некоторые документы находятся в слайдах, приведенных на недавней конференции Pycon Italia Tre - http://www.pycon.it/static/stuff/slides/distribuire-programmi-python-con-pyinstaller.pdf - и слайды на английском языке и содержат текущий адрес электронной почты сопровождающего, поэтому они должны помочь! (И пусть все лоббируют текущего сопровождающего, чтобы обновить документы...! -)

Ответ 3

Попробуйте добавить файл qt.conf в ваш каталог exe, чтобы указать qt, где найти бинарные файлы и плагины.

Что-то вроде следующих работ для простого случая, где вы просто сбрасываете все dll в том же каталоге, что и exe:

[Paths]
Prefix = .
Plugins = .

Обновление. Затем скопируйте содержимое плагинов (каталоги imageformat/sqldriver и т.д.) в exe-каталог. Я не думаю, что вы можете загрузить плагины DLL из того же каталога, что и exe. Подробнее о подключаемых подкаталогах см. Qt plugin doc. (Или, оставьте "плагины =." И скопируйте каталог плагинов в exe dir, поэтому у вас есть/plugins/imageloaders/qjpeg4.dll).

Ответ 4

Этьен - Спасибо за подсказку. После долгих чтений и пробных ошибок я пришел к такому же выводу: используйте PIL, чтобы показать jpegs в созданном py2app приложении.

http://www.thetoryparty.com/wp/2009/08/27/pyqt-and-py2app-seriously-i-dont-know-what-to-do-with-you-when-youre-like-this/

Я думаю, что предлагаемые решения для py2exe/Windows не обязательно применимы к py2app/OSX.

Ответ 5

Я на OSX Leopard. Предположим, что у вас есть приложение MyApp.app.

  • Поместите библиотеки libqjpeg.dylib и libqgif.dylib в
    MyApp.app/Contents/plugins/imageformats/
  • Поместите это в qt.conf в MyApp.app/Contents/resources/:

    [Paths]
    Prefix = .
    Binaries = .
    

На моей машине (Leopard) это работает.

Ответ 6

После попытки всех вышеупомянутых решений напрасно, я просто закончил использование PIL для загрузки изображений. Поскольку я хотел преобразовать эти изображения в текстуру в виджет OpenGL Qt, результат был таким же, независимо от того, загружаю ли я изображение с помощью Qt или PIL. Тем не менее, я сбиаю с толку, что такая основная вещь, как загрузка JPEG, настолько сложна в графической библиотеке, которая широко известна и широко используется как Qt.

Ответ 7

У меня была такая же проблема. Исправлено: http://mail.python.org/pipermail/python-list/2008-June/669374.html

  • Скопируйте плагины Qt в каталог: $YOUR_DIST_PATH/PyQt4/плагины;
  • Скопируйте qt.conf в каталог dist,
  • Редактировать qt.conf, изменить префикс на. /PyQt 4

Ответ 8

на окнах, предлагаемые решения работают отлично.

однако, в osx не может заставить его работать даже с инструкциями выше.

Вопрос

: файлы libqjpeg.dylib и libqgif.dylib находятся в каталоге /Developer/Applications/Qt/plugins/imageformats/, и если вы установили Qt самостоятельно, а не только PyQt. эти файлы не работают для меня.

в дистрибутиве PyQt, я вижу файлы libqjpeg.bundle и libqgif.bundle в /opt/local/libexec/qt4-mac/plugins/imageformats/, но это не библиотеки, и btw я тоже не могу открыть их содержимое, даже если у них есть расширение .bundle. использование этих файлов также не работает.

Мне любопытно узнать, что вы сделали, чтобы заставить его работать над osx. я установил PyQt после это руководство.

Ответ 9

Для меня проблема была решена, просто скопировав "qt.conf" для каталога исполняемого файла.

Вы можете найти "qt.conf" в... \PythonXX\Lib\site-packages\PyQt4\qt.conf.

Спасибо за помощь.

Ответ 10

Все вышеизложенное не удалось для меня, пока я не понял, что я связывал .exe(то есть, у меня была опция "bundle_files": 2 в моей setup.py. Я изменил ее на bundle_files = 2, и теперь она отлично работает.

Вышеупомянутые решения прекрасны. В частности, я просто добавил следующую строку в свой setup.py: data = [( "imageformats", glob.glob( "C:\Python26\Lib\site-packages\PyQt4\plugins\imageformats *.dll" ))]

(в дополнение к другим файлам, конечно).

Затем, DLL загрузки изображений находится в формате MY_EXE_DIR/imageformats

Мне не нужен qt.conf, чтобы сделать эту работу, хотя я уверен, что вы можете использовать ее, если хотите, чтобы ваше дерево каталогов было менее загромождено.

Ответ 11

Можно использовать плагин JPEG с py2exe'd script, даже используя bundle_files. Вам нужно устроить две вещи, чтобы это нормально работало:

  • Скопировать PyQt4/plugins/imageformats в выходной каталог py2exe (по умолчанию: dist)

    Вам нужно только скопировать нужные вам форматы.

  • При использовании опции bundle_files вам необходимо вывести файлы Qt dll из zipfile, используя параметр --dll-excludes для pyexe.

    Вам все равно придется копировать Qt DLL в выходной каталог каким-либо другим способом (например, используя опцию data_files).

Ответ 12

Спасибо за ваши полезные ответы на вопрос! Я столкнулся с той же проблемой, что и вы, и никакие решения не помогли. Надеюсь, я использовал VCS и обнаружил, что старая версия моего приложения загрузила изображения JPEG правильно, а новые версии перестали это делать. Я поймал эту ошибку, используя PySide v1.2.2.

Чтобы включить загрузку библиотек, я использовал то же решение, что и @Macke (т.е. добавил и отредактировал qt.conf).

Мой qt.conf был следующим:

[Paths]
Binaries = .
Plugins = qtplugins

C:\Python27\Lib\site-packages\PySide\plugins directory был скопирован в каталог qtplugins, поэтому у меня были следующие каталоги:

qtplugins\accessible
qtplugins\codecs
qtplugins\graphicssystems
qtplugins\iconengines
qtplugins\imageformats

У меня был следующий код:

class NotesCalendar(QtGui.QCalendarWidget):
    note_icon = QtGui.QImage("res/16note.png")

Перемещение переменной класса NotesCalendar.note_icon в конструктор решило проблему, и Qt начал правильно загружать свои библиотеки. Кажется, что конструктор переменной класса прервал некоторые внутренние вещи PySide.

Он работает без проблем в Windows. Задание правильного каталога qt.conf и копирования plugins достаточно, чтобы включить поддержку JPEG в py2exe + PySide построить. Конечно, у вас не должно быть проблем с вашим собственным кодом.

Я надеюсь, что это спасет кого-нибудь в день!;)