Странное отображение QPixmap
От: Lexerys Украина  
Дата: 30.05.20 16:39
Оценка:
Есть QLabel, в который кладется изображение:
  QLabel::setPixmap(QPixmap);

Изображение грабится с другого виджета:
  widget->grab();

На виджете (из которого грабится изображение) находится сцена (QGraphicScene), на сцене лежит QGraphicPixmapItem.
Пока в сцене лежит монохромное изображение (QImage::Format_Indexed8), все работает правильно.
Но если в сцене цветное изображение (QImage::Format_RGB32), то в QLabel изображение как бы замыленное, на нем практически ничего не видно, оно почти белое, но цветные контуры изображения немного прослеживаются.
Если QPixmap перед выводом в QLabel сохранить на диск и тут же загрузить в этот же QPixmap
  pixmap.save("image.jpg");
  pixmap = QPixmap("image.jpg");

то внезапно все отрисовывается правильно, и в файл сохраняется правильное изображение.
Глючит одинаково на винде, линуксе и макоси.
Поковырялся, ничего толком раскопать не смог, и обошел проблему с другой стороны (не граблю виджет, а рендерю изображение другим способом).

Но вот этот же нюанс вылез в другом месте, и там с другой стороны уже не обойти.
Причем в винде и линуксе все ок, а на MacOS (Catalina) — глюки.
Qt 5.6, 5.13 — одинаково.

В какую сторону копать, в чем может быть дело?
Спасибо.
Re: Странное отображение QPixmap
От: XOOIOOX  
Дата: 30.05.20 17:24
Оценка:
Здравствуйте, Lexerys, Вы писали:

L>Но если в сцене цветное изображение (QImage::Format_RGB32), то в QLabel изображение как бы замыленное, на нем практически ничего не видно, оно почти белое, но цветные контуры изображения немного прослеживаются.


ui.label2->setPixmap(QPixmap::fromImage(ui.label1->grab().toImage().convertToFormat(QImage::Format_ARGB32_Premultiplied)));

А если так?
Re[2]: Странное отображение QPixmap
От: Lexerys Украина  
Дата: 31.05.20 10:24
Оценка: 2 (1)
Здравствуйте, XOOIOOX, Вы писали:

XOO>
XOO>ui.label2->setPixmap(QPixmap::fromImage(ui.label1->grab().toImage().convertToFormat(QImage::Format_ARGB32_Premultiplied)));
XOO>

XOO>А если так?

Нет, никакой разницы.

Почитал еще документацию по QImage, заодно нашел у себя баг, который косвенно влиял на это.
Исходный QImage, который находится в виджете, имеет формат QImage::Format_RGB32.
При его генерации в альфа-канал записывались нули вместо 0xff.
Но в сцене изображение отображалось правильно, а QWidget::grab() уже работал неправильно, и на макоси проявлялось еще и другие нюансы.
Заполнение альфа-канала значением 0xff решило все проблемы на всех ОС.

Вот так, пока на rsdn не напишешь, решение почему-то не приходит =)
Re[3]: Странное отображение QPixmap
От: XOOIOOX  
Дата: 31.05.20 15:04
Оценка:
Здравствуйте, Lexerys, Вы писали:

L>Исходный QImage, который находится в виджете, имеет формат QImage::Format_RGB32.

L>При его генерации в альфа-канал записывались нули вместо 0xff.

К вопросу о единообразии представления картинок. Если все делать в ARGB32, скажем, и перед выводом конвертить в ARGB32_Premultiplied, который наиболее оптимизированный для отрисовки, то не вылезло бы.

L>Заполнение альфа-канала значением 0xff решило все проблемы на всех ОС.


По мне, так это некоторый костыль.

L>Пока в сцене лежит монохромное изображение (QImage::Format_Indexed8), все работает правильно.


Кстати, вот что в доке пишут:

Note: Drawing into a QImage with QImage::Format_Indexed8 is not supported.

 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.