2009-11-14 2 views
8

QImage에 이미지가 있습니다. 표시하기 전에 이미지를 PIL로 처리하고 싶습니다. ImageQT 클래스를 사용하면 PIL 이미지를 QImage로 변환 할 수 있지만 QImage에서 PIL 이미지로 이동하는 데는 아무 것도 나타나지 않습니다.PyQt를 PIL 이미지로 변환

답변

10

는이 코드로 PIL에 QImage에서 변환 :

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

이것은 파이썬 3에서도 작동합니다. "cStringIO.StringIO"를 "io.BytesIO"로 변경하십시오. – mzuther

0

당신은 파이썬 문자열로 QImage를 변환 할 수 있습니다 : PIL이에서 변환

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

이 용이해야한다.

+0

직접 이미지 데이터가 QImage와 PIL 이미지간에 호환되지 않는다고 생각하지 않습니다. Qt는 32 비트에서 모든 라인을 정렬합니다. 즉, 이미지 라인 당 바이트 수가 4로 나눌 수 없다면, 데이터에 쓰레기가 삽입 될 것입니다. 아마 더 많은 문제가 있습니다. –

2

다른 경로가 될 것이다 :

  1. 넣 NumPy와 배열로 이미지 데이터 (example code가 PIL 사용)
  2. 넣에 데이터를 NumPy와, scipy 또는 scikits.image를 사용하여 이미지를 조작 QImage (예 : scikits.image 아카이브 (1에 링크 됨)를 탐색하고 qt_plugin.py의 45 행을 봅니다. - 죄송합니다. stackoverflow에서 아직 더 많은 링크를 게시 할 수 없습니다.)

As Virgil에 따르면 데이터는 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() 

감사합니다. Eli Bendersky에게 감사드립니다.

+0

각 코드 줄 앞에 공백 4 개를 추가하는 것을 잊었습니다. 줄 사이에 줄 바꿈을 하나만 넣으면됩니다. – 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()