2

我使用 libpng 将 png (RGBA) 转换为 jpeg (RGB) 来解码 png 文件并应用 png_set_strip_alpha 来忽略 alpha 通道。但是转换后的输出图像有很多斑点。我认为原因是原始图像具有 alpha 为 0 的区域,无论其 RGB 值如何,它都会隐藏像素。当我剥离 alpha(即设置 alpha = 1)时,像素显示。所以我认为只使用 png_set_strip_alpha 不是正确的解决方案。我应该自己编写一个方法,还是已经有办法在 libpng 中实现这一点?

4

1 回答 1

3

没有办法。如果您放弃 alpha 通道,libpng 将为您提供原始 RGB 通道,这将“发现”以前不可见的颜色。

您应该加载 RGBA 图像并自己将其转换为 RGB。最简单的方法是将 RGB 值乘以 alpha。

这会将 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;
}
于 2013-08-28T18:22:46.837 回答