MFC—显示NX图标或透明背景图标

注意:只针对32位带alpha通道的BMP!

第一种方法(显示小图标不清晰):

	//加载位图
	CImage sourceImage;
	sourceImage.LoadFromResource(AfxGetInstanceHandle(), IDB_BMP_NX);

	//新建位图
	CImage showImage;
	showImage.Create(sourceImage.GetWidth(), sourceImage.GetHeight(), 32, CImage::createAlphaChannel);

	//转换数据
	if (sourceImage.GetBPP() == 32) //确认该图像包含Alpha通道 ,即改图片是否是32位像素
	{
		for (int i = 0; i < sourceImage.GetWidth(); i++)
		{
			for (int j = 0; j < sourceImage.GetHeight(); j++)
			{
				byte* pByte = (byte*)sourceImage.GetPixelAddress(i, j);
				byte* pByte2 = (byte*)showImage.GetPixelAddress(i, j);

				if (pByte[3] < 255)//alpha通道值
				{
					pByte2[0] = (pByte[0] * pByte[3] + 127) / 255;
					pByte2[1] = (pByte[1] * pByte[3] + 127) / 255;
					pByte2[2] = (pByte[2] * pByte[3] + 127) / 255;
					pByte2[3] = pByte[3];
				}
				else
				{
					pByte2[0] = pByte[0];
					pByte2[1] = pByte[1];
					pByte2[2] = pByte[2];
					pByte2[3] = pByte[3];
				}
			}
		}
	}

	//显示位图
	showImage.Draw(dc.GetSafeHdc(), 0, 0, sourceImage.GetWidth(), sourceImage.GetHeight(), 0, 0, showImage.GetWidth(), showImage.GetHeight());

第二种方法(推荐:小图显示清晰细腻):

	//关联DC
	Graphics graphics(dc.m_hDC);

	//加载位图
	HBITMAP hbmp = (HBITMAP)::LoadImage(GetModuleHandle(NULL),"C:\\Users\\HP\\Desktop\\replace_part.8s.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);
	
	//获取位图数据
	BITMAP bm;
	GetObject(hbmp, sizeof(bm), &bm);
	BYTE* source = (BYTE*)bm.bmBits;

	//新建32位带alpha通道的Bitmap
	Bitmap bitmap(bm.bmWidth, bm.bmHeight, PixelFormat32bppARGB);

	//拷贝位图数据
	Gdiplus::BitmapData datas;
	Gdiplus::Rect rc(0, 0, bm.bmWidth, bm.bmHeight);
	bitmap.LockBits(&rc, ImageLockModeWrite, PixelFormat32bppARGB, &datas);
	byte* dest = (byte*)(datas.Scan0);
	for (int i = 0; i < bm.bmHeight; i++)
	{
		memcpy(dest + (i * bm.bmWidthBytes),
			source + ((bm.bmHeight - i - 1) * bm.bmWidthBytes), bm.bmWidthBytes);
	}
	bitmap.UnlockBits(&datas);

	//绘制位图
	graphics.DrawImage(&bitmap, 0, 0);

	//删除资源
	DeleteObject(hbmp);

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

恩·艾克斯·红

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值