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
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.
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.
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 ... –
için bir başka yol olacaktır:
- yüklenebilir bir numpy diziye görüntü verileri (example code PIL kullanılarak)
- 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.
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
Elbette, işte burada: https://github.com/stefanv/scikits.image/blob/master/scikits/image/ io/_plugins/qt_plugin.py # L45 –
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.
Her kod satırından önce dört boşluk eklemeyi unutun (ve satırlar arasında yalnızca bir satırsonu ekleyin). – SamB
#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()
Bu da Python3'te çalışır, sadece "cStringIO.StringIO" "io.BytesIO" olarak değiştirin. – mzuther