2009-11-14 9 views
8

QImage uygulamasında bir resmim var ve görüntülemeden önce PIL'de işlem yapmak istiyorum. ImageQT sınıfı bir PIL Image'i bir QImage'a dönüştürmeme izin verirken, QImage'dan PIL Image'e gitmek için hiçbir şey görünmüyor.PyQt - PIL görüntüsüne dönüştürme

cevap

10

Bu kod ile PIL için Qimage onu dönüştürmek:

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) 

Devam etsin diye almadan önce birçok kombinasyonları denedi.

+0

Bu da Python3'te çalışır, sadece "cStringIO.StringIO" "io.BytesIO" olarak değiştirin. – mzuther

0

Bir Python dizeye bir Qimage dönüştürebilirsiniz: PIL bu dönüştürme

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

kolay olmalıdır.

+0

Doğrudan görüntü verilerinin QImage ve PIL görüntüleri arasında uyumlu olduğunu düşünmüyorum. Bazıları etrafta donduktan sonra ne bulduğumu öğrendim (beni ısırdı): Qt, 32 bit üzerindeki tüm çizgilerini hizalar. Bu, görüntü için satır başına bayt sayısı 4 ile bölünemezse, veriye eklenmiş bir bokun olacağı anlamına gelir. Belki de daha fazla var ... –

2

için bir başka yol olacaktır:

  1. yüklenebilir bir numpy diziye görüntü verileri (example code PIL kullanılarak)
  2. yüklenebilir bir veri numpy, scipy veya scikits.image kullanarak görüntü işlemek Qimage (örnek: 1 bağlantılı scikits.image arşivini (göz) ve qt_plugin.py hattı 45 bakmak - maalesef stackoverflow beni daha da bağlantıları yazılan izin vermez)

As Virgil'den bahsedilirse, veriler 32 bit (veya 4 bayt) hizalanmış olmalıdır, bu da adım 3'te (snippet'te gösterildiği gibi) adımı belirtmeyi hatırlamanız gerektiği anlamına gelir.

+0

Diğer bağlantıyı ekleyebilir misiniz? (Bu problemi yaşadığım zaman, ikinci bağlantıyı tutmak için başka bir cevap gönderdim ;-) – SamB

+0

Elbette, işte burada: 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() 

Teşekkürler Eli Bendersky, kodunuz yardımcı oldu.

+0

Her kod satırından önce dört boşluk eklemeyi unutun (ve satırlar arasında yalnızca bir satırsonu ekleyin). – 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()