Access qrpython images without writing them to file

时间:2015-09-01 21:33:32

标签: python qr-code

Here's my problem.

I'm building a simple QR-code generator with qrcode and PyQt4. In particular, this application shows an image of the generated QR-code inside a QPixmap of a QLabel. The problem is that the qrmodule, as far as I know, allows only to save the generated image to a file. I tried to access the inner workings of qrcode but it's kind of convoluted.

Do you know if it's possible to expose the image by saving the resulting image in a file stream, like the one from tempfile.TemporaryFile()? Otherwise I can only insert the qr-code by saving it on a real file and then loading it. For example

import qrcode as q
from PyQt4 import QtGui

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

pixmap = QtGui.QPixmap(filename)

EDIT 1

I tried to use the PIL.ImageQt.ImageQt function as proposed in an answer in the following way

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_())

The result is not however consistent. This is the result obtained using the method above

Damaged QR code

And this is the result using qrcode.make('Some test data').save('test2.png')

Good QR code

Am I missing something? The ImageQt function si a subclass of QImage as far as I understand, in fact I get no runtime errors, but the image is corrupted.

1 个答案:

答案 0 :(得分:0)

It turns out it takes a couple of steps to do this but you don't need to mess around with intermediate files. Note that the QRcode that qrcode generates is a PIL (python image library but its best to use the fork pillow) object. PIL provides the handy ImageQt module to convert your QR code into an Qimage object. Next you need to use the method QtGui.QPixmap.fromImage to create a pixmap (this method seg faults unless qt's initialisation has been done). The complete code would look something like this:

>>> 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)

Obviously you can neaten that up somewhat but it works.