【问题标题】:Enabling JPEG support for QImage in py2exe-compiled Python scripts?在 py2exe 编译的 Python 脚本中启用对 QImage 的 JPEG 支持?
【发布时间】:2016-10-06 19:00:20
【问题描述】:

我正在尝试通过 PyQt4 在 Python 脚本的 QImage 对象中使用 JPEG 图像。

脚本本身运行良好,图像加载并且可以操作和渲染等等。但是,当我尝试用 py2exe“编译”这个脚本时,除了 JPEG 图像外,一切正常。用等效的 PNG 替换它是可行的,但由于我的程序从网络下载图像,它们并不总是 PNG 格式,我不能用另一个库将它们全部转换。

我发现 QImage 的 JPEG 图像支持以及其他图像格式是由 \qt\plugins\imageformats 目录中的一些 DLL 提供的(它们被称为 qjpeg4.dll 和 qjpeg4d.dll)。我想我需要在我的可执行文件中以某种方式使用它们,但我不知道如何。我试过简单地将它们复制到我的 exe 目录,没有运气。我已经尝试,作为indicated here,将这些文件作为 data_files 包含在 setup.py 脚本中,但没有运气(看起来它所做的只是将这些文件复制到 exe 的目录,所以它不会改变手动复制它们反正)。

我确信有一些应用程序使用 PyQt 和 JPEG 图像,它们是如何做到的?这似乎是一项微不足道的任务,但我现在坚持下去了。

另外,我希望我的应用程序是跨平台的(为什么我还要用 Python 编码?),我希望在为 OS X 或Linux。我会吗?

【问题讨论】:

    标签: qt pyqt jpeg py2exe qimage


    【解决方案1】:

    在同一个问题纠结了几个小时后,我想分享一下在 windows vista 上对我有用的解决方案: 使用python2.6

    将以下目录复制到py2exe生成的dist目录中:

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

    我只是将 imageformats 目录直接放到了我的 dist 目录中,没有对 qt.conf 或类似的东西做任何进一步的修改。我还没有尝试过,但这可能也适用于声子。

    【讨论】:

    • 有些人的评论是内联的:我也使用了这个解决方案。它在win7 32/64、xp sp3专业版(32位)上完美运行。但是,它在 xp sp2(32 位)上失败,我通过“进程资源管理器”比较 xp sp3 和 xp sp2,xp sp2 丢失 ..\imageformats*.dll 我不知道要解决...有人有解决方案吗?跨度>
    【解决方案2】:

    我不得不承认,我从来没有设法让 py2exe + pyqt 组合完全正确(而且,py2exe 对跨平台打包根本没有帮助)。 PyInstaller 似乎要好得多——http://www.pyinstaller.org/ 的文档很旧,但 svn 主干是更新的。一些文档在最近的 Pycon Italia Tre 会议上提供的幻灯片中——http://www.pycon.it/static/stuff/slides/distribuire-programmi-python-con-pyinstaller.pdf——而且,这些幻灯片是英文的,并且包含当前维护者的电子邮件,所以它们应该有所帮助! (而且,让我们都游说当前的维护者更新文档...!-)

    【讨论】:

    • 不走运。我获取了 PyInstaller 的最新 SVN 快照,它能够编译我的程序,但它没有 JPEG 支持,也没有任何图像格式插件,尽管 SupportedPackages 页面声称它们得到完全支持。但是 PyInstaller 检测 Qt 插件目录的方式被破坏并返回了一个无效的路径,我通过创建一个符号链接(或在 NTFS 上调用的“连接”)来修复它。我又试了一次脚本,这次它确实检测到了 Qt4 插件并将它们复制到 exe 的目录中,但是再次运行 exe 时,仍然不支持 JPEG! :(
    【解决方案3】:

    尝试将qt.conf 文件添加到您的 exe 目录中,以告诉 qt 在哪里可以找到二进制文件和插件。

    以下内容适用于简单的情况,您只需将所有 dll 转储到与 exe 相同的目录中:

    [Paths]
    Prefix = .
    Plugins = .
    

    更新:然后将您的插件内容(imageformat/sqldriver 目录等)复制到 exe 目录。我认为您不能从与 exe 相同的目录中加载插件 dll。有关插件子目录的详细信息,请参阅Qt plugin doc。 (或者,省略 'plugins = .' 并将 plugins 目录复制到 exe 目录,这样你就有了 /plugins/imageloaders/qjpeg4.dll)。

    【讨论】:

    • 是的,我也试过了,但仍然没有:(只加载 PNG 图像。我想我应该考虑使用另一个模块/库转换所有图像。关于我应该使用哪个的任何建议?
    • 如何删除 plugins 行并将 qt-plugins 目录手动复制到输出目录(这样你就有了 /plugins/imageloaders/qjpeg4.dll)。另外,如果你使用pyqt的qt.conf,是否有效?
    • 哦。许多人通常使用 DevIL 来加载图像。我自己没有尝试过,因为我总是使用更大的库。
    【解决方案4】:

    艾蒂安 -- 谢谢你的提示。经过大量阅读和反复试验,我得出了相同的结论:使用 PIL 在 py2app 生成的应用程序中显示 jpeg。

    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.dyliblibqgif.dylib 放入
        MyApp.app/Contents/plugins/imageformats/
      • 把这个放在qt.confMyApp.app/Contents/resources/:

        [Paths]
        Prefix = .
        Binaries = .
        

      在我的机器 (Leopard) 上可以。

      【讨论】:

        【解决方案6】:

        在尝试了上述所有解决方案都徒劳无功之后,我最终还是使用 PIL 来加载我的图像。由于我想将这些图像转换为 OpenGL Qt 小部件中的纹理,因此无论我使用 Qt 还是 PIL 加载图像,结果都是相同的。尽管如此,我仍然感到困惑的是,在像 Qt 一样广为人知且广泛使用的 GUI 库中,加载 JPEG 之类的基本事情是如此复杂。

        【讨论】:

          【解决方案7】:

          我遇到了完全相同的问题。使用此修复它:http://mail.python.org/pipermail/python-list/2008-June/669374.html

          1. 将Qt插件复制到目录:$YOUR_DIST_PATH/PyQt4/plugins;
          2. 将 qt.conf 复制到你的 dist 目录;
          3. 编辑 qt.conf,将 Prefix 更改为 ./PyQt4

          【讨论】:

          • 我确实尝试过,但徒劳无功:(我想我是在这里做错了什么,但无论如何,我的程序现在可以工作......
          【解决方案8】:

          对我来说,只需复制可执行文件目录的“qt.conf”即可解决问题。

          您可以在 ...\PythonXX\Lib\site-packages\PyQt4\qt.conf 中找到“qt.conf”。

          感谢您的帮助。

          【讨论】:

          • 您好,只是一个更正...当我复制文件“qt.conf”和文件夹“imageformats”时,问题解决了。您可以在“...\PythonXX\Lib\site-packages\PyQt4\plugins”中找到该文件夹​​ :-) 谢谢。
          【解决方案9】:

          上述一切对我来说都失败了,直到我意识到我正在捆绑 .exe(也就是说,我的 setup.py 中有选项“bundle_files”:2。我将其更改为 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 来完成这项工作,但我相信如果你想让你的目录树不那么混乱,你可以使用它。

          【讨论】:

            【解决方案10】:

            可以使用带有 py2exe 脚本的 JPEG 插件,甚至使用 bundle_files。您需要安排两件事才能使其正常工作:

            1. 复制PyQt4/plugins/imageformats到py2exe的输出目录(默认:dist

              您只需复制您实际需要的格式。

            2. 使用 bundle_files 选项时,您需要从 使用 pyexe 的 --dll-excludes 选项的 zipfile。

              您仍然需要通过其他方式将 Qt DLL 复制到输出目录(例如 通过使用data_files 选项)。

            【讨论】:

              【解决方案11】:

              在 Windows 上,建议的解决方案完美运行。

              但是,即使按照上面的说明,在 osx 上也无法使其工作。

              问题是:libqjpeg.dyliblibqgif.dylib 文件位于/Developer/Applications/Qt/plugins/imageformats/ 目录中,如果你安装了Qt 本身,而不仅仅是PyQt。这些文件对我不起作用。

              在 PyQt 发行版中,我在 /opt/local/libexec/qt4-mac/plugins/imageformats/ 中看到文件 libqjpeg.bundlelibqgif.bundle,但是这些不是库,顺便说一句,我也无法打开它们的内容,即使它们具有 .bundle 扩展名。使用这些文件也不起作用。

              我很想知道你做了什么让它在 osx 上工作。我在this guide 之后安装了 PyQt。

              【讨论】:

                【解决方案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 目录足以在py2exe 中启用JPEG 支持 + PySide 构建。当然,你自己的代码一定没有问题。

                我希望这可以节省一天的时间! ;)

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2018-07-25
                  • 1970-01-01
                  • 2014-09-09
                  • 2021-11-25
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多