精通
英语
和
开源
,
擅长
开发
与
培训
,
胸怀四海
第一信赖
锐英源精品开源,禁止转载和任何形式的非法内容使用,违者必究
cbitmap保存文件为透明背景格式为.png的图片。
可以先保存文件为带白色背景的的.png的图片,然后利用TransparentPNG()函数,把png图片没像素的RGB值进行处理的方法,来消除白色背景色。
在Onpaint消息相应函数中载入图片并且显示出来,load载入,否则不会显示,在调用上面的透明化处理函数TransparentPNG()来进行图像的处理。图像处理函数是采用遍历像素的处理方法来完成的。
部分代码:
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;
}
}
}
设置透明背景图片:
使用API函数TransparentBlt,这个函数可以把原DC中的图片绘制到目标DC中,并且同时设置原图形在目标图形上的透明色。例如把透明色设置为彩色图形自带背景色时,使用这个函数后得到最终图形上彩色图形的自身背景色就消除了。部分代码:
CDC* pDC=GetDC();
CBitmap bmp;
bmp.LoadBitmap(IDB_BITMAP1);
BITMAP bmpInfo;
bmp.GetObject(sizeof(BITMAP),&bmpInfo);
CDC ImageDC;
ImageDC.CreateCompatibleDC(pDC);
CBitmap *pOldImageBmp=ImageDC.SelectObject(&bmp);
CBitmap bmpBK;
bmpBK.LoadBitmap(IDB_BITMAP2);
BITMAP bmpBkInfo;
bmpBK.GetObject(sizeof(BITMAP),&bmpBkInfo);
CDC bkDC;
bkDC.CreateCompatibleDC(pDC);
bkDC.SelectObject(&bmpBK);
TransparentBlt(bkDC.m_hDC,100,150,bmpInfo.bmWidth,bmpInfo.bmHeight,ImageDC.m_hDC,0,0,bmpInfo.bmWidth,bmpInfo.bmHeight,RGB(255,0,0)); // 设置红色为透明色
BitBlt(pDC->m_hDC,0,0,bmpBkInfo.bmWidth,bmpBkInfo.bmHeight,bkDC.m_hDC,0,0,SRCCOPY);
//画到屏幕上
上述解决问题的思路是通过设置掩码位图,建立一个掩码位图;用掩码位图覆盖在色彩原图,得到了一个新的图;使用掩码位图和目标背景图相与;使用得到的新图与目标背景图相或可以得到最终的图。