Russian Qt Forum
Май 04, 2024, 11:47 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО] сохранение прозрачности у QImage  (Прочитано 3373 раз)
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« : Октябрь 13, 2021, 15:37 »

Здравствуйте. Создаю QImage из голых байт в режиме Format_Indexed8, также задаю палитру через setColorTable(). Байты изначально забиваю прозрачными пикселями:
Код
C++ (Qt)
std::vector<uint8_t> pixels(frameHeader.width * frameHeader.height, colorPalette.size() - 1);
где прозрачный цвет (второй параметр конструктора) равен qRgba(0, 0, 0, 0).

При сохранении картинки в формате png прозрачный цвет становится черным, не понимаю как побороть. Пробовал сохранять в виде image.save("1.png", "png") и через QImageWriter с настройками по умолчанию. Также пробовал предварительно конвертировать изображение в форматы Format_ARGB32 / Format_ARGB32_Premultiplied с/без флажка NoOpaqueDetection. Установка прозрачного цвета в qRgba(255, 255, 255, 0) также не помогает.

Тестировал на Qt 4.8.7, пример полученного изображения во вложении.
« Последнее редактирование: Октябрь 14, 2021, 13:47 от kambala » Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Октябрь 13, 2021, 16:09 »

При сохранении картинки в формате png прозрачный цвет становится черным,
Ваш аттач имеет альфа-канал, он "весь белый". Format_Indexed8 - по-моему у него альфы и нет, при сохранении ARGB32 будет что в аттаче
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #2 : Октябрь 13, 2021, 16:35 »

При сохранении картинки в формате png прозрачный цвет становится черным,
Ваш аттач имеет альфа-канал, он "весь белый". Format_Indexed8 - по-моему у него альфы и нет, при сохранении ARGB32 будет что в аттаче
так а что надо сделать, чтоб альфа появилась в конечном изображении?
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Октябрь 13, 2021, 17:14 »

так а что надо сделать, чтоб альфа появилась в конечном изображении?
Она там есть, наверно Вы хотите "альфа-маску", надо ее откуда-то взять/создать, здесь не видно др источника/данных кроме черных пыкселей. Значит в ARGB32 и по буферу
Код
C++ (Qt)
if (p == 0xff000000)  // или 0x000000ff, могу путать
 p = 0;

Ну или "готовые проверенные" типа createAlphaMask и др
« Последнее редактирование: Октябрь 13, 2021, 17:18 от Igors » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #4 : Октябрь 13, 2021, 18:21 »

Спасибо за помощь.

Кажется я понял свою ошибку: у меня палитра и так уже содержит 256 цветов, а я свой прозрачный цвет влепил туда 257-м Улыбающийся

Получается, мне надо или вектор argb (и руками конвертировать индексы) или задавать пиксели сразу на QImage.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Октябрь 14, 2021, 12:08 »

Кажется я понял свою ошибку: у меня палитра и так уже содержит 256 цветов, а я свой прозрачный цвет влепил туда 257-м Улыбающийся
Indexed8 - это "байт на точку", альфу негде хранить. Назначить один из 256 прозрачным можно, но это коряво

Получается, мне надо или вектор argb (и руками конвертировать индексы) или задавать пиксели сразу на QImage.
Indexed8  - вроде бы заманчиво (в 4 раза меньше данных), но не оправдывает себя, проще и лучше юзать ARGB_32 (и выше если нужно). Тогда можно спокойно зачистить с Qt::transparent и рисовать с альфой (uint на точку). Заметим что создание альфа-маски "из черных пикселей" не обеспечивает тот же рез-т всегда
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #6 : Октябрь 14, 2021, 13:06 »

Назначить один из 256 прозрачным можно, но это коряво
а почему?
проще и лучше юзать ARGB_32 (и выше если нужно). Тогда можно спокойно зачистить с Qt::transparent и рисовать с альфой (uint на точку).
да, так и сделал, на всякий случай поставил ARGB32_Premultiplied — теперь все как надо Улыбающийся

еще раз спасибо!
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Октябрь 14, 2021, 13:35 »

а почему?
Ну придется рисовать "с оглядкой на него", и полученная альфа 1 бит (bool). Оно может "сегодня больше и не надо", но будет и завтра
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.152 секунд. Запросов: 23.