Russian Qt Forum

Qt => Мультимедиа => Тема начата: kambala от Октябрь 13, 2021, 15:37



Название: [РЕШЕНО] сохранение прозрачности у QImage
Отправлено: kambala от Октябрь 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, пример полученного изображения во вложении.


Название: Re: сохранение прозрачности у QImage
Отправлено: Igors от Октябрь 13, 2021, 16:09
При сохранении картинки в формате png прозрачный цвет становится черным,
Ваш аттач имеет альфа-канал, он "весь белый". Format_Indexed8 - по-моему у него альфы и нет, при сохранении ARGB32 будет что в аттаче


Название: Re: сохранение прозрачности у QImage
Отправлено: kambala от Октябрь 13, 2021, 16:35
При сохранении картинки в формате png прозрачный цвет становится черным,
Ваш аттач имеет альфа-канал, он "весь белый". Format_Indexed8 - по-моему у него альфы и нет, при сохранении ARGB32 будет что в аттаче
так а что надо сделать, чтоб альфа появилась в конечном изображении?


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

Ну или "готовые проверенные" типа createAlphaMask и др


Название: Re: сохранение прозрачности у QImage
Отправлено: kambala от Октябрь 13, 2021, 18:21
Спасибо за помощь.

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

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


Название: Re: сохранение прозрачности у QImage
Отправлено: Igors от Октябрь 14, 2021, 12:08
Кажется я понял свою ошибку: у меня палитра и так уже содержит 256 цветов, а я свой прозрачный цвет влепил туда 257-м :)
Indexed8 - это "байт на точку", альфу негде хранить. Назначить один из 256 прозрачным можно, но это коряво

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


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

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


Название: Re: сохранение прозрачности у QImage
Отправлено: Igors от Октябрь 14, 2021, 13:35
а почему?
Ну придется рисовать "с оглядкой на него", и полученная альфа 1 бит (bool). Оно может "сегодня больше и не надо", но будет и завтра