为什么在将RGBA图像转换为RGB时会留下斑点?

时间:2012-12-14 03:37:42

标签: libpng

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

1 个答案:

答案 0 :(得分:2)

没有办法解决这个问题。如果你删除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;
}