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
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.
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.
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 ... –
Inna droga może być:
- ładowania danych obrazu do numpy tablicy (example code pomocą PIL)
- manipulować obrazu za numpy, scipy lub scikits.image
- ł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).
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
Oczywiście, tutaj jest: 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()
Dzięki Eli Bendersky Twój kod był pomocny.
Zapomniałeś dodać cztery spacje przed każdą linią kodu (i wstawić tylko jeden znak między wierszami). – 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()
- 1. Konwersja PIL GdkPixbuf
- 2. PIL - Konwersja ramek GIF do JPG
- 3. Jak przekonwertować powierzchnię pygame do obrazu PIL?
- 4. Konwersja obrazu do base64
- 5. Konwersja JPanel do obrazu
- 6. PIL Konwersja PNG lub GIF z przezroczystością do JPG bez
- 7. Konwersja strony internetowej do obrazu
- 8. konwersja tablicy bajtów do obrazu
- 9. Java konwersja obrazu do BufferedImage
- 10. Konwersja obrazu GIF do NSData
- 11. Python PIL: Jak narysować elipsę pośrodku obrazu?
- 12. Jak utworzyć obraz OpenCV z obrazu PIL?
- 13. Błąd podczas otwierania pliku obrazu w PIL
- 14. Kontur obrazu za pomocą python/PIL
- 15. PIL: Miniatura i skończyć z placu obrazu
- 16. Jak zbudować obiekt obrazu w PIL/Pythonie
- 17. Jak wyświetlić obiekt obrazu PIL w szablonie?
- 18. PIL jak skalować rozmiar tekstu w stosunku do rozmiaru obrazu
- 19. Jak przekonwertować tablicę Numpy do obrazu PIL stosując matplotlib colormap
- 20. PIL: zmiana rozmiaru obrazu: algorytm podobny do Firefoksa
- 21. Konwersja obrazu macierzy opencv do danych obrazu tensorflow
- 22. Konwersja z BufferedImage do SWT obrazu
- 23. Konwersja fragmentu mapy ulotki do obrazu
- 24. Konwersja obrazu do cylindrycznego kształtu w java
- 25. Konwersja obrazu na płótno/HTML5
- 26. Konwersja typu obrazu na bitmapę
- 27. Konwersja formatu obrazu w pytonie
- 28. Jak uzyskać rozmiar obrazu (bajty) przy użyciu PIL
- 29. Python PIL: IOError: nie można zidentyfikować plik obrazu
- 30. PIL ImageTK nie ładuje obrazu w pakiecie aplikacji py2app
Działa to również w Pythonie3, wystarczy zmienić "cStringIO.StringIO" na "io.BytesIO". – mzuther