MFC中CImage的透明处理

       在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代码才弄好的,哎!

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值