【问题标题】:Access qrpython images without writing them to file访问 qrpython 图像而不将它们写入文件
【发布时间】:2015-09-01 21:33:32
【问题描述】:

这是我的问题。

我正在使用 qrcode 和 PyQt4 构建一个简单的 QR 码生成器。特别是,此应用程序在QLabelQPixmap 内显示生成的二维码图像。问题是,据我所知,qrmodule 只允许将生成的图像保存到文件中。我试图访问qrcode内部工作,但这有点令人费解。

您知道是否可以通过将生成的图像保存在文件流中来公开图像,例如来自tempfile.TemporaryFile() 的文件流?否则我只能通过将其保存在真实文件中然后加载来插入二维码。例如

import qrcode as q
from PyQt4 import QtGui

filename = 'path/to/file.png'
img = q.make('Data')
img.save(filename)

pixmap = QtGui.QPixmap(filename)

编辑 1

我尝试通过以下方式使用答案中提出的PIL.ImageQt.ImageQt 函数

import sys
import qrcode as qr
from PyQt4 import QtGui
from PIL import ImageQt

a = QtGui.QApplication(sys.argv)
l = QtGui.QLabel()
pix = QtGui.QPixmap.fromImage(ImageQt.ImageQt(qr.make("Some test data")))
l.setPixmap(pix)
l.show()
sys.exit(a.exec_())

然而结果并不一致。这是使用上述方法得到的结果

这是使用qrcode.make('Some test data').save('test2.png')的结果

我错过了什么吗?据我了解,ImageQt 函数是QImage 的子类,实际上我没有遇到运行时错误,但图像已损坏。

【问题讨论】:

    标签: python qr-code


    【解决方案1】:

    事实证明,执行此操作需要几个步骤,但您无需处理中间文件。请注意,qrcode 生成的二维码是 PIL(python 图像库,但最好使用叉枕)对象。 PIL 提供了方便的ImageQt 模块将您的二维码转换为Qimage 对象。接下来您需要使用方法QtGui.QPixmap.fromImage 创建一个像素图(除非qt 的初始化已经完成,否则此方法会出错)。完整的代码如下所示:

    >>> import qrcode as q
    >>> from PyQt4 import QtGui
    >>> from PIL import ImageQt
    >>> import sys
    >>> app = QtGui.QApplication(sys.argv) # line 8 seg faults without this
    >>> qrcode = q.make("some test data")
    >>> qt_image = ImageQt.ImageQt(qrcode)
    >>> pixmap = QtGui.QPixmap.fromImage(qt_image)
    

    显然你可以稍微整理一下,但它确实有效。

    【讨论】:

    • 这指向了我认为的正确方式,但它并没有像希望的那样工作。有关详细信息,请参阅我的编辑 1。
    • @mmassaro。这真的很奇怪。那我再挖点。
    • @mmassaro 此方法适用于使用Image.open 方法创建的枕头图像(即由真正的PNG 支持的图像),尽管这对您没有多大帮助。我认为ImageQt.ImageQt 方法不喜欢出于某种原因动态创建的 PIL 对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-17
    • 2022-08-16
    • 1970-01-01
    相关资源
    最近更新 更多