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