码迷,mamicode.com
首页 > 编程语言 > 详细

VC++使用CImage PNG转BMP图片透明背景处理

时间:2017-05-25 13:32:42      阅读:255      评论:0      收藏:0      [点我收藏+]

标签:颜色   优点   锯齿   border   pos   需要   save   line   定义   

PNG格式的图片是支持透明通道的,BMP格式的图片是没有透明通道的,所以当PNG格式的图片转换为BMP格式时,对于PNG图片的透明背景就需要进行特别的处理。

VC++中的HBITMAP是支持透明色的,如果HBITMAP是PNG格式图片的句柄,使用CImage:Save或其它方式保存到文件时,透明背景会变成黑色。

技术分享

解决这个问题可以用GDI+、LIBPNG等,最简单的方式是使用CImage,直接将图像数据中的透明部分替换为白色或其他颜色。

优点:处理方法简单,效率高,只需CImage;

缺点:在图片拐角处产生略微锯齿;

技术分享

贴出我写的函数,大家可以结合自己的需要决定是否使用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
HBITMAP TransparentImage(HBITMAP hBitmap)
{
    CImage Image;
    Image.Attach(hBitmap);
    int nPitch = Image.GetPitch( ) , nBPP = Image.GetBPP( );
    LPBYTE lpBits = reinterpret_castLPBYTE>( Image.GetBits( ) );
    forint yPos = 0 ; yPos < Image.GetHeight( ) ; yPos ++ )
    {
        LPBYTE lpBytes = lpBits + ( yPos * nPitch );
        PDWORD lpLines = reinterpret_cast< PDWORD >( lpBytes );
        forint xPos = 0 ; xPos < Image.GetWidth( ) ; xPos ++ )
        {
            if( nBPP == 32 && lpLines[ xPos ] >> 24 != 0x000000FF)
            {
                lpLines[ xPos ] |= 0xFFFFFFFF ;
            }
        }
    }
    return Image.Detach();
}

lpLines[ xPos ] |= 0xFFFFFFFF为要替换成的颜色,设置为自定义颜色值即可。


 

记录,为更好的自己!

VC++使用CImage PNG转BMP图片透明背景处理

标签:颜色   优点   锯齿   border   pos   需要   save   line   定义   

原文地址:http://www.cnblogs.com/yangmingyu/p/6903067.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!