Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Access qrpython images without writing them to file

Tags:

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 Answers

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.

like image 175
or1426 Avatar answered Dec 07 '25 17:12

or1426



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!