Есть 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 — одинаково.
В какую сторону копать, в чем может быть дело?
Спасибо.
Здравствуйте, Lexerys, Вы писали:
L>Но если в сцене цветное изображение (QImage::Format_RGB32), то в QLabel изображение как бы замыленное, на нем практически ничего не видно, оно почти белое, но цветные контуры изображения немного прослеживаются.
ui.label2->setPixmap(QPixmap::fromImage(ui.label1->grab().toImage().convertToFormat(QImage::Format_ARGB32_Premultiplied)));
А если так?
Здравствуйте, 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 не напишешь, решение почему-то не приходит =)
Здравствуйте, 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.