在MFC中使用CImage进行贴图的时候可以发现原本图片透明的地方也显示出了白色,本文将详细介绍如何对CImage进行透明贴图,第一部分将介绍透明贴图的实现步骤,第二部分将介绍其实现原理。
1.如何实现CImage透明贴图
其实现步骤可由一下代码实现:
CImage img;
img.Load(_T("(你的工作路径)//keys_base.png"));
for(int i = 0; i < img.GetWidth(); i++)
{
for(int j = 0; j < img.GetHeight(); j++)
{
unsigned char* pucColor = reinterpret_cast<unsigned char *>(img.GetPixelAddress(i , j));
pucColor[0] = (pucColor[0] * pucColor[3]+127) / 255;
pucColor[1] = (pucColor[1] * pucColor[3] +127)/ 255;
pucColor[2] = (pucColor[2] * pucColor[3]+127) / 255;
}
}
2.透明贴图的实现原理
PNG图片的透明显示与Alpha预乘有关,要了解Alpha预乘则需先了解PNG图片的Alpha通道。PNG图片由(R,G,B,α)四个通道组成,即每个像素由一个四维数组组成,其中Alpha通道即透明通道,它决定每个像素的透明度。Alpha通道借用不同的灰度值表示透明度的大小,在8bits色彩空间中的α通道,有256级透明变化范围。每一级对应一个透明度,255级为不透明,0级为完全透明。
Alpha预乘是指计算机在存储图像样本的RGB之前先用Alpha值乘以这些的技术。对于PNG中Alpha预乘后RGB通道的计算公式为(alpha*color+127)/255,这是因为PNG中RGB的范围均为(0~255),+127是为了满足四舍五入的要求。在进行预乘后的图像即可正常显示其透明度,但微软默认的是图片加载时已进行了预乘,因此没有进行预乘的操作,导致了不透明显示。在知道这个原理之后我们只有手动的对PNG图片进行Alpha预乘即可还原其透明显示了。上文中pucColor[0],pucColor[1],pucColor[2],pucColor[3]分别代表RGB和Alpha通道,因此可以很好立即其透明显示的操作。
最后吐一下槽,这个CSDN的编辑器真心让我很无力啊,这格式调了我半天啊。。。。还是在源码页里面改HTML代码才弄好的,哎!