Конвертировать PyQt в PIL изображение - PullRequest
9 голосов
/ 14 ноября 2009

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

Ответы [ 6 ]

12 голосов
/ 18 ноября 2009

Я конвертирую его из 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)

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

2 голосов
/ 20 ноября 2009

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

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

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

1 голос
/ 31 августа 2010
#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()
1 голос
/ 28 августа 2010
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()

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

0 голосов
/ 30 апреля 2019

Вот ответ для тех, кто использует PySide2 5.x, официальную упаковку Python для qt. Они также должны работать на PyQt 5.x

Я также добавил к QImage к numpy, которые я использовал в связи с этим. Я предпочитаю использовать зависимость PIL, главным образом потому, что мне не нужно отслеживать изменения цветовых каналов.

from PySide2 import QtCore, QtGui
from PIL import Image
import io


def qimage_to_pimage(qimage: QtGui.QImage) -> Image:
    """
    Convert qimage to PIL.Image

    Code adapted from SO:
    https://stackoverflow.com/a/1756587/7330813
    """
    bio = io.BytesIO()
    bfr = QtCore.QBuffer()
    bfr.open(QtCore.QIODevice.ReadWrite)
    qimage.save(bfr, 'PNG')
    bytearr = bfr.data()
    bio.write(bytearr.data())
    bfr.close()
    bio.seek(0)
    img = Image.open(bio)
    return img

Здесь можно преобразовать numpy.ndarray в QImage

from PIL import Image, ImageQt
import numpy as np

def array_to_qimage(arr: np.ndarray):
    "Convert numpy array to QImage"
    img = Image.fromarray(arr)
    return ImageQt.ImageQt(img)

0 голосов
/ 14 ноября 2009

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

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

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

...