2009-11-14 4 views
8

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

ответ

10

преобразовать его из 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) 

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

+0

Это также работает в Python3, просто измените «cStringIO.StringIO» на «io.BytesIO». – mzuther

0

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

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

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

+0

Я не думаю, что данные прямого изображения совместимы между изображениями QImage и PIL. То, что я узнал после некоторого messing вокруг (это бит меня): Qt выравнивает все свои строки на 32 бит, а это означает, что если количество байтов на строку для изображения не делится на 4, в данные будут вставлены дерьмы. Возможно, есть еще больше gotchas ... –

2

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

  1. Загрузить данные изображения в массив Numpy (example code с помощью PIL)
  2. Манипулирование изображение с помощью NumPy, SciPy или scikits.image
  3. Загрузка данных в QImage (пример: просматривать архив scikits.image (связанный в 1) и смотреть на линию 45 qt_plugin.py - извините, StackOverflow не позволит мне размещать больше ссылок пока)

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

+0

Можете ли вы добавить еще одну ссылку? (Назад, когда у меня была эта проблема, я только что опубликовал другой ответ, чтобы провести вторую ссылку ;-) – SamB

+0

Конечно, вот оно: https://github.com/stefanv/scikits.image/blob/master/scikits/image/ io/_plugins/qt_plugin.py # L45 –

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

Thanks Eli Bendersky, ваш код был полезным.

+0

Вы забыли добавить четыре пробела перед каждой строкой кода (и поставить только одну новую строку между строками). – SamB

1
#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() 
Смежные вопросы