Я создаю мозаику изображений с помощью PIL и хочу просмотреть результат с помощью QGraphicsView. Для этого я создал подкласс QtImageViewer. Соответствующий метод есть
def setImage(self, image):
""" Set the scene's current image pixmap to the input QImage or QPixmap.
Raises a RuntimeError if the input image has type other than QImage or QPixmap.
:type image: QImage | QPixmap
"""
# image.save("r:/test.png")
if isinstance(image, QPixmap):
pixmap = image
elif isinstance(image, QImage):
pixmap = QPixmap.fromImage(image)
else:
raise RuntimeError("ImageViewer.setImage: Argument must be a QImage or QPixmap.")
if self.hasImage():
self._pixmapHandle.setPixmap(pixmap)
else:
self._pixmapHandle = self.scene.addPixmap(pixmap)
self.setSceneRect(QRectF(pixmap.rect())) # Set scene size to image size.
self.updateViewer()
Вызов, который я делаю из его подкласса, гласит:
def redraw(self):
img = Image.new("RGB", (self.width(), self.height()), "gray")
if self._source is not None:
self._source.paintMap(img)
img.save("r:/debug.png")
# self.setImage(QImage("r:\debug.png"))
self.setImage(ImageQt(img))
В обоих фрагментах есть строки тестового кода, сохраняющие содержимое изображения во временные файлы. Когда я сохраняю изображение PIL (img.save("r:/debug.png")) и создаю QImage из этого файла (self.setImage(QImage("r:\debug.png"))), изображение отображается правильно.
проблема
результат, который я получаю при обычном запуске:
Сейчас можно наблюдать три сценария:
Так что, думаю, что-то не так в ImageQt, что со временем может быть поправлено. Странное поведение напоминает проблему Ник Морган обсуждает, но просто обертывание изображениеQt внутри другого QImage не меняет дела в лучшую сторону. И о, да, я работаю под Windows.
Далее: нет никакой связи с Проблема преобразования изображения PIL в QPixmap, поскольку этот вопрос касается порядка цветовых каналов и не имеет ничего общего с ложными указателями памяти в imageQt.
вопросы
доступен ли альтернативный метод преобразования (сохранение и чтение в качестве обходного пути?)?
можно ли заставить imageQt вести себя так, как должно (или я сам что-то делаю не так)?
Как указано выше, эта часть является тестовым кодом. Я специально упоминаю об этом здесь, чтобы показать, что изображение само по себе хорошее и может отображаться правильно. Нет необходимости сохранять/читать изображение и, таким образом, замедлять работу программы, но я не согласен с тем, что само по себе это плохая идея, при условии, что это делается в подходящей временной папке.
Я понимаю этот момент, но все же 1) В чем проблема? Вы не объясняете внятно, похоже, вы предполагаете, что мы знаем вашу проблему, 2) вы должны предоставить MCVE
Меня сбивает с толку, как вы можете пометить это как дубликат, если вы даже не понимаете вопроса. Здесь вы почти полностью ошибаетесь.
Поскольку ваш ответ эквивалентен фразе «Используйте другой ответ», я также понял ваш вопрос, когда вы делали свое последнее издание (изображения), но я видел ответ, который указывает на другой ответ, который эквивалентен дубликат.
Падраик Каннингем решил проблему сбоя Python в Преобразование Pillow (PIL) в QImage -> python.exe перестал работать и предложил обходной путь. Однако в его примере кода цветовые полосы перепутаны. На эту проблему отвечает Иордания в Проблема преобразования pil-image в qpixmap. Итак, наконец, эта адаптация решает мою проблему:
def redraw(self):
img = Image.new("RGB", (self.width(), self.height()), "gray")
if self._source is not None:
self._source.paintMap(img)
data = img.convert("RGB").tostring("raw", "RGB")
qimg = QImage(data, img.size[0], img.size[1], QImage.Format_RGB888)
self.setImage(qimg)
Я не понимаю вашего вопроса, почему вам нужно сохранить файл, чтобы просто прочитать его обратно?, что может принести несколько неудобств в долгосрочной перспективе, потому что много раз вы не хотите сохранять на жесткий диск по разным причинам. У вас есть проблема с преобразованием изображения PIL в QImage? Какая проблема у ImageQt? предоставить минимальный воспроизводимый пример