工作需要又得使用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有时候太不方便太繁琐了。