Как избежать (PIL) странного поведения imageQt?

Я создаю мозаику изображений с помощью 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"))), изображение отображается правильно.

проблема

желаемый результат: Как избежать (PIL) странного поведения imageQt?

результат, который я получаю при обычном запуске: Как избежать (PIL) странного поведения imageQt?

Сейчас можно наблюдать три сценария:

  1. просто запустите код (без тестового кода): отображается графика, но, по-видимому, это блок случайной памяти, хотя, казалось бы, всегда один и тот же.
  2. отладьте код, остановите его в setImage() и сохраните входящее изображение: и сохраненный файл, и отображаемое изображение верны.
  3. отлаживать или запускать с раскомментированной строкой image.save("r:/test.png"): тогда python дает сбой.

Так что, думаю, что-то не так в ImageQt, что со временем может быть поправлено. Странное поведение напоминает проблему Ник Морган обсуждает, но просто обертывание изображениеQt внутри другого QImage не меняет дела в лучшую сторону. И о, да, я работаю под Windows.

Далее: нет никакой связи с Проблема преобразования изображения PIL в QPixmap, поскольку этот вопрос касается порядка цветовых каналов и не имеет ничего общего с ложными указателями памяти в imageQt.

вопросы

  • доступен ли альтернативный метод преобразования (сохранение и чтение в качестве обходного пути?)?

  • можно ли заставить imageQt вести себя так, как должно (или я сам что-то делаю не так)?

Я не понимаю вашего вопроса, почему вам нужно сохранить файл, чтобы просто прочитать его обратно?, что может принести несколько неудобств в долгосрочной перспективе, потому что много раз вы не хотите сохранять на жесткий диск по разным причинам. У вас есть проблема с преобразованием изображения PIL в QImage? Какая проблема у ImageQt? предоставить минимальный воспроизводимый пример

eyllanesc 11.06.2019 02:43

Как указано выше, эта часть является тестовым кодом. Я специально упоминаю об этом здесь, чтобы показать, что изображение само по себе хорошее и может отображаться правильно. Нет необходимости сохранять/читать изображение и, таким образом, замедлять работу программы, но я не согласен с тем, что само по себе это плохая идея, при условии, что это делается в подходящей временной папке.

user508402 11.06.2019 10:07

Я понимаю этот момент, но все же 1) В чем проблема? Вы не объясняете внятно, похоже, вы предполагаете, что мы знаем вашу проблему, 2) вы должны предоставить MCVE

eyllanesc 11.06.2019 10:10

Меня сбивает с толку, как вы можете пометить это как дубликат, если вы даже не понимаете вопроса. Здесь вы почти полностью ошибаетесь.

user508402 14.06.2019 21:20

Поскольку ваш ответ эквивалентен фразе «Используйте другой ответ», я также понял ваш вопрос, когда вы делали свое последнее издание (изображения), но я видел ответ, который указывает на другой ответ, который эквивалентен дубликат.

eyllanesc 14.06.2019 21:23
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
5
209
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Падраик Каннингем решил проблему сбоя 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)

Другие вопросы по теме