MFC环境下显示透明PNG图片

工作需要又得使用MFC编调试软件。

需要载入一张公司的logo,透明PNG图片。

查了很多资料都没显示,也不想使用其他类。最后用Cimage基本解决。

1.在对话框类的头文件中定义:

CImage img;

2.在Onpaint消息响应函数中载入图片并显示图片。
if (IsIconic())
{
		CPaintDC dc(this); // 用于绘制的设备上下文

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		// 使图标在工作区矩形中居中
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;


		// 绘制图标
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
            CPaintDC dc(this);        
            if(!img.IsNull()) img.Destroy();
              img.Load(_T("12.png"));                           //load载入,否则不显示
            TransparentPNG(&img);                               //调用透明化处理函数
            if(!img.IsNull()) img.Draw(dc.m_hDC, 80, 20);      //以左上角为原点,按原始大小,在(80,20)处贴图

            CDialogEx::OnPaint();
	}


3.直接载入将会的到衣服背景色不透明的图片,很傻单也简单实用的办法,将png图像的没像素的RGB值惊进行处理,消除白色背景。
void TransparentPNG(CImage *png)  
{  
    for(int i = 0; i <png->GetWidth(); i++)  				//遍历像素处理
    {  
        for(int j = 0; j <png->GetHeight(); j++)  
        {  
            unsigned char* pucColor = reinterpret_cast<unsigned char*>(png->GetPixelAddress(i , j));  
            pucColor[0] = pucColor[0] *pucColor[3] / 255;  
            pucColor[1] = pucColor[1] *pucColor[3] / 255;  
            pucColor[2] = pucColor[2] *pucColor[3] / 255;  
        }  
    }  
}

至此就简单的实现了。

不得不吐槽MFC有时候太不方便太繁琐了。

经验分享 程序员 微信小程序 职场和发展