读书人

施用CImage类保存透明背景的PNG图

发布时间: 2013-04-09 16:45:09 作者: rapoo

使用CImage类,保存透明背景的PNG图
as.png已经是背景是透明的图片了,想要缩小它后保存,发现不管用Draw还是StretchBlt函数,保存后的图片背景要不就是白色要不就是黑色,没办法透明!!!
问题出在哪呢?代码如下,是Create的问题吗?
CString s;
CImage imDest;
CImage Q,Q1;
CString s1,s2;
imDest.Destroy();
s.Format(_T("D:/as.png"));
s1.Format(_T("C:/Users/admin/Desktop/asdd.png"));
HRESULT ret = imDest.Load(s);
Q.Create(imDest.GetWidth(), imDest.GetHeight(), 32);
imDest.Draw(Q.GetDC(), 0, 0, Q.GetWidth(), Q.GetHeight(), 0, 0,imDest.GetWidth(), imDest.GetHeight());
//SetStretchBltMode(Q.GetDC(),COLORONCOLOR);
//imDest.StretchBlt(Q.GetDC(), 0, 0, Q.GetWidth(), Q.GetHeight(), 0, 0,imDest.GetWidth(), imDest.GetHeight(), SRCCOPY);
Q.Save(s1);



[解决办法]
CImage加载PNG要显示透明的话,要加一些代码,部分如下,楼主参考着看看
其中
CImage imgObject;


HRESULT hResult;

hResult = imgObject.Load(lpImgFile);
if (SUCCEEDED(hResult))
{
// PNG图像透明色修正
int nBtnImgWidth = imgObject.GetWidth();
int nBtnImgHeight = imgObject.GetHeight();

for(int i = 0; i < nBtnImgWidth; ++i)
{
for(int j = 0; j < nBtnImgHeight; ++j)
{
unsigned char * pucColor = (unsigned char *)imgObject.GetPixelAddress(i, j);
pucColor[0] = pucColor[0] * pucColor[3] / 255;
pucColor[1] = pucColor[1] * pucColor[3] / 255;
pucColor[2] = pucColor[2] * pucColor[3] / 255;
}
}

}

[解决办法]
用 AlphaBlend
CImage::AlphaBlend

[解决办法]
引用:
CImage加载PNG要显示透明的话,要加一些代码,部分如下,楼主参考着看看
其中
CImage imgObject;
C/C++ code

HRESULT hResult;

hResult = imgObject.Load(lpImgFile);
if (SUCCEEDED(hResult))
{
// PNG图像透明色修正
……

加这个确实可以,可以许多图片的话,都要处理,太麻烦了
[解决办法]
试试6楼的方法吧。

读书人网 >VC/MFC

热点推荐