Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Convert PyQt to PIL image

I have an image in a QImage and I want to process it in PIL before I display it. While the ImageQT class lets me convert a PIL Image to a QImage, there doesn't appear to anything to go from a QImage to a PIL Image.

like image 508
directedition Avatar asked Nov 14 '09 03:11

directedition


3 Answers

I convert it from QImage to PIL with this code:

img = QImage("/tmp/example.png")
buffer = QBuffer()
buffer.open(QIODevice.ReadWrite)
img.save(buffer, "PNG")

strio = cStringIO.StringIO()
strio.write(buffer.data())
buffer.close()
strio.seek(0)
pil_im = Image.open(strio)

I tried many combinations before getting it to work.

like image 92
skuda Avatar answered Nov 07 '22 11:11

skuda


from PyQt5 import QtGui
from PIL import Image

img = QtGui.QImage(width, height, QImage.Format_RGBA8888)
data = img.constBits().asstring(img.byteCount())
pilimg = Image.frombuffer('RGBA', (img.width(), img.height()), data, 'raw', 'RGBA', 0, 1)
from PyQt4 import QtGui
from PIL import Image

img = QtGui.QImage("greyScaleImage.png")
bytes = img.bits().asstring(img.numBytes())
pilimg = Image.frombuffer('L', (img.width(), img.height()), bytes, 'raw', 'L', 0, 1)
pilimg.show()

Thanks Eli Bendersky, your code was helpful.

like image 32
Chenna V Avatar answered Nov 07 '22 11:11

Chenna V


Another route would be:

  1. Load the image data into a numpy array (example code using PIL)
  2. Manipulate the image using numpy, scipy or scikits.image
  3. Load the data into a QImage (example: browse the scikits.image archive (linked in 1) and look on line 45 of qt_plugin.py -- sorry, stackoverflow doesn't allow me to post more links yet)

As Virgil mentions, the data must be 32-bit (or 4-byte) aligned, which means you need to remember to specify the strides in step 3 (as shown in the snippet).

like image 2
Stefan van der Walt Avatar answered Nov 07 '22 09:11

Stefan van der Walt