从网上下的png图片可以透明显示,自己做的png透明图片就会显示白色背景,这个png图片要怎么做?
解决方案 »
- 当窗口尺寸大于屏物理大小时,窗里的许多控件都看不到,如何办?
- SerialPort类的串口接口程序?
- 救急!!
- 如何绘制不被视频流覆盖的矩形框?
- 怎样使CListctrl第一列中的各项居中显示?
- InternetReadFile的问题(能解决的多加分)
- 这是算不算VC的bug呢,模式对话框下主窗口依然能够处理消息。。。。。。。。
- 如何在程序中获得其它可执行程序的执行结果?
- 各位passer,我就着两天打算写一份关于H323协议的详细研究报告,想要的请进来举手!!俺都给~~~
- 紧急向有经验的高人求救,如何让使用vc6的atl编写的进程外组件(exe)支持CString?
- Winsock控件,急
- 为何调用其他类的函数编译没错,运行出错,我跟踪发现"GetDlgItem运行有问题,怎么解决啊
CImage是不能画png的,透明部分变成白色了。
这个地址是我在百度空间写的,将CImage的像素进行了转换后绘制透明png。
if (Image.GetBPP() == 32) //确认该图像包含Alpha通道
{
int i;
int j;
for (i=0; i<Image.GetWidth(); i++)
{
for (j=0; j<Image.GetHeight(); j++)
{
byte *pByte = (byte *)Image.GetPixelAddress(i, j);
pByte[0] = pByte[0] * pByte[3] / 255;
pByte[1] = pByte[1] * pByte[3] / 255;
pByte[2] = pByte[2] * pByte[3] / 255;
}
}
}
如:
CDC *pDC = GetDC();
CImage Image;
Image.Load(strPath);
if (Image.IsNull())
{
MessageBox(_T("没加载成功"));
return -1;
}
if (Image.GetBPP() == 32) //确认该图像包含Alpha通道
{
int i;
int j;
for (i=0; i<Image.GetWidth(); i++)
{
for (j=0; j<Image.GetHeight(); j++)
{
byte *pByte = (byte *)Image.GetPixelAddress(i, j);
pByte[0] = pByte[0] * pByte[3] / 255;
pByte[1] = pByte[1] * pByte[3] / 255;
pByte[2] = pByte[2] * pByte[3] / 255;
}
}
}
Image.Draw(pDC->m_hDC,0,0);
Image.Destroy();
ReleaseDC(pDC);
if (Image.GetBPP() == 32) //确认该图像包含Alpha通道
{
int i;
int j;
for (i=0; i<Image.GetWidth(); i++)
{
for (j=0; j<Image.GetHeight(); j++)
{
byte *pByte = (byte *)Image.GetPixelAddress(i, j);
pByte[0] = pByte[0] * pByte[3] / 255;
pByte[1] = pByte[1] * pByte[3] / 255;
pByte[2] = pByte[2] * pByte[3] / 255;
}
}
}如:
CDC *pDC = GetDC();
CImage Image;
LoadImageFromResource(&Image,IDB_PNG1,_T("PNG"));
if (Image.IsNull())
{
MessageBox(_T("没加载成功"));
return;
}
if (Image.GetBPP() == 32) //确认该图像包含Alpha通道
{
int i;
int j;
for (i=0; i<Image.GetWidth(); i++)
{
for (j=0; j<Image.GetHeight(); j++)
{
byte *pByte = (byte *)Image.GetPixelAddress(i, j);
pByte[0] = pByte[0] * pByte[3] / 255;
pByte[1] = pByte[1] * pByte[3] / 255;
pByte[2] = pByte[2] * pByte[3] / 255;
}
}
}
Image.Draw(pDC->m_hDC,0,0);
Image.Destroy();
ReleaseDC(pDC);
gdi+和用CImage绘制png图片
他的png图片确实是可以直接显示的
我自己做就不行
Image iSourceImage(A2W(cstrTempSourceFileName));//源文件路径 Graphics graphics(&img);
graphics.SetSmoothingMode(SmoothingModeAntiAlias);
graphics.SetInterpolationMode(InterpolationModeHighQualityBicubic); ImageAttributes imageAttr;
imageAttr.SetColorKey(Gdiplus::Color(255,255,255),Gdiplus::Color(255,255,255),Gdiplus::ColorAdjustTypeDefault);//透明像素开始-结束
graphics.DrawImage(&iSourceImage,Gdiplus::Rect(0,0,rect.Width(),rect.Height()),0,0,rect.Width(),rect.Height(),UnitPixel,&imageAttr);
CLSID pngClsid;
GetEncoderClsidOwn(L"image/png",&pngClsid);
img.Save(A2W(cstrFileName),&pngClsid,NULL);