GDI+如何将多张PNG图片合成一张并且保存
GDI+如何将多张PNG图片合成一张并且保存
网上找了很多。都是在onpaint里面去做,好奇怪啊。还一定需要上下文设备。。。搞不懂GDI+的代码怎么都写的那么依赖上下文设备
也不太复杂个功能。思路都明白。就是不会写。哎,厚着脸要现成的代码了。惭愧!!!
[解决办法]
可以不依赖任何上下文设备
//创建一个位图,用来保存合成后的图像
Gdiplus::Bitmap* pBitmap=new Bitmap(合成后宽度,合成后高度,PixelFormat32bppARGB);
Gdiplus::Graphics g(pBitmap);
Gdiplus::Bitmap tmp1(L"c:\\001.png");//载入你要合并的PNG
g.DrawImage(&tmp1,.....);
Gdiplus::Bitmap tmp2(L"c:\\002.png");//载入你要合并的PNG
g.DrawImage(&tmp2,.....);
pBitmap->Save(....);//保存合并后的图像,完工!
[解决办法]
CLSID encoderClsid;
EncoderParameters encoderParameters;
int quality = 100; // jpeg图象质量
encoderParameters.Count = 1;
encoderParameters.Parameter[0].Guid = EncoderQuality;
encoderParameters.Parameter[0].Type = EncoderParameterValueTypeLong;
encoderParameters.Parameter[0].NumberOfValues = 1;
encoderParameters.Parameter[0].Value = &quality;
if(strExt==_T("jpg")){
GetEncoderClsid(L"image/jpeg", &encoderClsid);
}else if(strExt==_T("gif")){
GetEncoderClsid(L"image/gif", &encoderClsid);
}else if(strExt==_T("png")){
GetEncoderClsid(L"image/png", &encoderClsid);
}else if(strExt==_T("bmp")){
GetEncoderClsid(L"image/bmp", &encoderClsid);
}
pBitmap->Save(strFileName, &encoderClsid, &encoderParameters);
int GetEncoderClsid(LPCWSTR format, CLSID* pClsid)
{
UINT num = 0; // number of image encoders
UINT size = 0; // size of the image encoder array in bytes
ImageCodecInfo* pImageCodecInfo = NULL;
GetImageEncodersSize(&num, &size);
if(size == 0)
return -1; // Failure
pImageCodecInfo = (ImageCodecInfo*)(malloc(size));
if(pImageCodecInfo == NULL)
return -1; // Failure
GetImageEncoders(num, size, pImageCodecInfo);
for(UINT j = 0; j < num; ++j)
{
if( wcscmp(pImageCodecInfo[j].MimeType, format) == 0 )
{
*pClsid = pImageCodecInfo[j].Clsid;
free(pImageCodecInfo);
return j; // Success
}
}
free(pImageCodecInfo);
return -1; // Failure
}