Преобразование PyQt в изображение PIL

У меня есть изображение в QImage, и я хочу обработать его в PIL, прежде чем отображать его. В то время как класс ImageQT позволяет мне конвертировать изображение PIL в QImage, кажется, нет ничего, чтобы перейти от QImage к изображению PIL.

5 ответов


Я конвертирую его из QImage в PIL с помощью этого кода:

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)

Я пробовал много комбинаций, прежде чем заставить его работать.


другой маршрут будет:

  1. загрузите данные изображения в массив numpy (пример кода использование PIL)
  2. манипулировать изображением с помощью numpy, scipy или scikits.изображение
  3. загрузите данные в QImage (пример: просмотрите scikits.архив изображений (связанный в 1) и посмотрите на строку 45 qt_plugin.py -- извините, stackoverflow не позволяет мне размещать больше ссылок)

Как упоминает Вергилий, данные должны быть 32-битными (или 4-байтовыми) выровнено, что означает, что вам нужно не забыть указать шаги на Шаге 3 (как показано в фрагменте).


#Code for converting grayscale QImage to PIL image

from PyQt4 import QtGui, QtCore
qimage1 = QtGui.QImage("t1.png")
bytes=qimage1.bits().asstring(qimage1.numBytes())
from PIL import Image
pilimg = Image.frombuffer("L",(qimage1.width(),qimage1.height()),bytes,'raw', "L", 0, 1)
pilimg.show()

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

спасибо Эли Бендерски, ваш код был полезен.


вы можете преобразовать QImage в строку Python:

>>> image = QImage(256, 256, QImage.Format_ARGB32)
>>> bytes = image.bits().asstring(image.numBytes())
>>> len(bytes)
262144

преобразование из этого в PIL должно быть легко.