Я преобразовал png (RGBA) в jpeg (RGB), используя libpng для декодирования файла png и применив png_set_strip_alpha для игнорирования альфа-каналов. Но после преобразования на выходном изображении много пятен. Я думаю, причина в том, что исходное изображение имеет области с альфа-значением 0, что скрывает пиксель независимо от его значения RGB. И когда я убираю альфа (т.е. устанавливаю альфа = 1), пиксель показывает. Поэтому я думаю, что просто использование png_set_strip_alpha не является правильным решением. Следует ли мне самому написать метод или уже есть способ добиться этого в libpng?
1 ответ
Для этого нет метода. Если вы отбросите альфа-канал, libpng предоставит вам необработанные каналы RGB, и это «раскроет» цвета, которые ранее были невидимы.
Вам следует загрузить изображение в формате RGBA и самостоятельно преобразовать его в формат RGB. Самый простой способ - умножить значения RGB на альфа.
Это преобразует растровое изображение RGBA в RGB на месте:
for(int i=0; i < width*height; i++) {
int r = bitmap[i*4+0],
g = bitmap[i*4+1],
b = bitmap[i*4+2],
a = bitmap[i*4+3];
bitmap[i*3+0] = r * a / 255;
bitmap[i*3+1] = g * a / 255;
bitmap[i*3+2] = b * a / 255;
}
Похожие вопросы
Новые вопросы
libpng
libpng является официальной справочной библиотекой PNG, поддерживающей большинство всех возможностей PNG, является расширяемой и широко используется и тестируется уже более двадцати лет.