积极答复者
GDI+的SAVE方法保存成PNG格式的图片,为什么把黑色当透明色去掉了?

问题
-
GDI+的SAVE方法保存成PNG格式的图片,为什么把黑色当透明色去掉了?
- 已移动 周雪峰MVP, Moderator 2009年12月24日 8:16 移动主题 (发件人:一般性问题讨论区)
答案
-
Bitmap 有一个MakeTransparent 方法,可以指定任意色为透明色,你可以指定成图片中没有的一个颜色。
另外构造时:
Bitmap bmp(ddsd.dwWidth,ddsd.dwHeight,PixelFormat32bppARGB);
PixelFormat 可以更换一下试试看。
感謝您的回復,我剛才研究了一下並且自己解決了。
原來似乎DDRAW被設置KEYCOLOR的圖像的A分量被設置為了0,我把代碼改成這樣就行了。
UINT& temp = dest_ptr[row * ddsd.lPitch /4 +col];
pixels[row * bd.Stride / 4 + col]=(temp&0xFF000000)==0 ? temp|0xFF000000 : temp;- 已标记为答案 流川枫 2009年12月27日 7:57
全部回复
-
你好!
请问你使用的是哪个Save方法,可以提供简单的代码吗?
周雪峰
int GetImageCLSID(const WCHAR* format, CLSID* pCLSID)
{ //得到格式为format的图像文件的编码值,访问该格式图像的COM组件的GUID值保存在pCLSID中
UINT num = 0;
UINT size = 0;
ImageCodecInfo* pImageCodecInfo = NULL;
GetImageEncodersSize(&num, &size);
if(size == 0)
return FALSE; // 编码信息不可用
//分配内存
pImageCodecInfo = (ImageCodecInfo*)(malloc(size));
if(pImageCodecInfo == NULL)
return FALSE; // 分配失败
//获得系统中可用的编码方式的所有信息
GetImageEncoders(num, size, pImageCodecInfo);
//在可用编码信息中查找format格式是否被支持
for(UINT i = 0; i < num; ++i)
{ //MimeType:编码方式的具体描述
if( wcscmp(pImageCodecInfo[i].MimeType, format) == 0 )
{ *pCLSID = pImageCodecInfo[i].Clsid;
free(pImageCodecInfo);
return TRUE;
} } free(pImageCodecInfo);
return FALSE;
}CLSID pngClsid;
GetImageCLSID(L"image/png",&pngClsid);
DDSURFACEDESC2 ddsd;
ddsd.dwSize = sizeof(ddsd);
lpdds->Lock(NULL,
&ddsd,
DDLOCK_WAIT | DDLOCK_SURFACEMEMORYPTR,
NULL);
if (ddsd.lPitch/ddsd.dwWidth==4)
{
UINT *dest_ptr = (UINT *)ddsd.lpSurface;
Bitmap bmp(ddsd.dwWidth,ddsd.dwHeight,PixelFormat32bppARGB);
BitmapData bd;
bmp.LockBits(NULL,ImageLockModeRead,PixelFormat32bppARGB,&bd);
UINT* pixels = (UINT*)bd.Scan0;
for(UINT row = 0; row < bd.Height; ++row)
{
for(UINT col = 0; col < bd.Width; ++col)
{
pixels[row * bd.Stride / 4 + col]=dest_ptr[row * ddsd.lPitch /4 +col];
}
}
bmp.UnlockBits(&bd);
bmp.Save(pszLibFileW,&pngClsid,NULL);
方便 的话加个QQ不 350773875 求教 -
Bitmap 有一个MakeTransparent 方法,可以指定任意色为透明色,你可以指定成图片中没有的一个颜色。
另外构造时:
Bitmap bmp(ddsd.dwWidth,ddsd.dwHeight,PixelFormat32bppARGB);
PixelFormat 可以更换一下试试看。
感謝您的回復,我剛才研究了一下並且自己解決了。
原來似乎DDRAW被設置KEYCOLOR的圖像的A分量被設置為了0,我把代碼改成這樣就行了。
UINT& temp = dest_ptr[row * ddsd.lPitch /4 +col];
pixels[row * bd.Stride / 4 + col]=(temp&0xFF000000)==0 ? temp|0xFF000000 : temp;- 已标记为答案 流川枫 2009年12月27日 7:57