Я преобразовал png (RGBA) в jpeg (RGB), используя libpng для декодирования файла png и применив png_set_strip_alpha для игнорирования альфа-каналов. Но после преобразования на выходном изображении много пятен. Я думаю, причина в том, что исходное изображение имеет области с альфа-значением 0, что скрывает пиксель независимо от его значения RGB. И когда я убираю альфа (т.е. устанавливаю альфа = 1), пиксель показывает. Поэтому я думаю, что просто использование png_set_strip_alpha не является правильным решением. Следует ли мне самому написать метод или уже есть способ добиться этого в libpng?

2
Tinker Sun 14 Дек 2012 в 07:37

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;
}
3
Kornel 28 Авг 2013 в 22:22