2009-11-14 11 views
8

Mam obraz w pliku QImage i chcę go przetworzyć w pliku PIL przed wyświetleniem. Podczas gdy klasa ImageQT pozwala mi konwertować obraz PIL na obraz QImage, nie wydaje się, aby cokolwiek mogło przejść z obrazu QImage do obrazu PIL.Konwersja PyQt do obrazu PIL

Odpowiedz

10

przekonwertować go z QImage do PIL z tym kodem:

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) 

próbowałem wiele kombinacji, zanim się go do pracy.

+0

Działa to również w Pythonie3, wystarczy zmienić "cStringIO.StringIO" na "io.BytesIO". – mzuther

0

można przekonwertować QImage na ciąg Python:

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

Konwersja z PIL to powinno być łatwe.

+0

Nie sądzę, że bezpośrednie dane obrazu są zgodne między obrazami QImage i PIL. Co dowiedziałem się po tym, jak trochę się zepsułem (to mnie ugryzło): Qt wyrównuje wszystkie linie na 32-bitach, co oznacza, że ​​jeśli liczba bajtów na linię dla obrazu nie jest podzielna przez 4, w danych będzie wstawione bzdury. Może jest jeszcze więcej gotch ... –

2

Inna droga może być:

  1. ładowania danych obrazu do numpy tablicy (example code pomocą PIL)
  2. manipulować obrazu za numpy, scipy lub scikits.image
  3. ładowania danych do QImage (przykład: przeglądaj archiwum scikits.image (połączone w 1) i spójrz na linię 45 qt_plugin.py - przepraszam, stackoverflow nie pozwala mi jeszcze opublikować więcej linków)

Jak Virgil wspomina, że ​​dane muszą być 32-bitowe (lub 4-bajtowe) wyrównane, co oznacza, że ​​należy pamiętać o określeniu kroków w kroku 3 (jak pokazano w opisie).

+0

Czy możesz dodać jeszcze inny link? (Wracając, kiedy miałem ten problem, właśnie wysłałem kolejną odpowiedź na drugi link ;-) – SamB

+0

Oczywiście, tutaj jest: 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() 

Dzięki Eli Bendersky Twój kod był pomocny.

+0

Zapomniałeś dodać cztery spacje przed każdą linią kodu (i wstawić tylko jeden znak między wierszami). – 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()