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

本文介绍了一种使用CImage类在VC++中将PNG格式的图片转换为BMP格式并修复透明背景的方法。通过简单的代码实现,避免了在图片拐角处产生的锯齿现象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

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

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

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

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

HBITMAP TransparentImage(HBITMAP hBitmap)
{
	CImage Image;
	Image.Attach(hBitmap);
	int nPitch = Image.GetPitch( ) , nBPP = Image.GetBPP( );
	LPBYTE lpBits = reinterpret_cast< LPBYTE>( Image.GetBits( ) );

	for( int yPos = 0 ; yPos < Image.GetHeight( ) ; yPos ++ )
	{
		LPBYTE lpBytes = lpBits + ( yPos * nPitch );
		PDWORD lpLines = reinterpret_cast< PDWORD >( lpBytes );
		for( int xPos = 0 ; xPos < Image.GetWidth( ) ; xPos ++ )
		{
			if( nBPP == 32 && lpLines[ xPos ] >> 24 != 0x000000FF)
			{
				lpLines[ xPos ] |= 0xFFFFFFFF ;
			}
		}
	}

	return Image.Detach();
}

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


 

记录,为更好的自己!

转载于:https://www.cnblogs.com/ym123/p/4180610.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值