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有时候太不方便太繁琐了。