GDI+如何将多张PNG图片合成一张并且保存 GDI+如何将多张PNG图片合成一张并且保存网上找了很多。都是在onpaint里面去做,好奇怪啊。还一定需要上下文设备搞不懂GDI+的代码怎么都写的那么依赖上下文设备也不太复杂个功能。思路都明白。就是不会写。哎,厚着脸要现成的代码了。惭愧!!! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 首先 GDI+ 是 GDI 的升级版它也是需要场景设备才能进行绘图,只不过它对 HDC 进行了内部封装,就像你使用 CDC 一样,调用函数不用再带一个 HDC 的参数。要不然你会说,一个简单的 CDC 类为什么那么依赖上下文设备了第二,你所需要的代码是图片合并再保存人家的代码是需要加载图片(可能合并)然后直接绘图呈现给用户看的,跟你的需求不一样,所以你不能怪别人在哪里进行处理要怪只能怪你自己看不懂函数体里面的代码而如果你看懂了里面的代码,那么你管它是在哪处理的,你只要把方法搬过来,然后你自己写个函数不就行了而如果你看不懂,那么就算人家给你代码了,你也会说人家的方法不对啊,为什么那么依赖上下文设备目前我还没发现哪个类或者哪个函数能不用场景设备来进行图片的处理 拼接.可以考虑多个png绘制到临时dc上,然后保存.就是多个绘制的合成图. 可以不依赖任何上下文设备//创建一个位图,用来保存合成后的图像Gdiplus::Bitmap* pBitmap=new Bitmap(合成后宽度,合成后高度,PixelFormat32bppARGB);Gdiplus::Graphics g(pBitmap);Gdiplus::Bitmap tmp1(L"c:\\001.png");//载入你要合并的PNGg.DrawImage(&tmp1,.....);Gdiplus::Bitmap tmp2(L"c:\\002.png");//载入你要合并的PNGg.DrawImage(&tmp2,.....);pBitmap->Save(....);//保存合并后的图像,完工! 保存的图像打开了之后显示没有预览。引用的CLSID值是CCCCCCC-CCC这样的。请问是为什么啊 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 } 老问题 关于在对话框中实时显示数据,高手详细指点一下 我要学习vc++做游戏,给我点意见吧。嘿嘿 DShow内存泄漏 用ATL连接点封装一个由dll导出的回调函数 一个单文档视图,控件上加载控件.问题. 怎样用SMTP类发关邮件时通过服务器的验证?(100分) 指针的小问题? 采用UDP方式接收和发送的包的最大长度是多少? 初级问题 : 有关写文件地 ODBC开发数据库的问题 【求助】visual studio 2005 怎么调试子进程 静态库与c库兼容//下面写法对吗???
它也是需要场景设备才能进行绘图,只不过它对 HDC 进行了内部封装,就像你使用 CDC 一样,调用函数不用再带一个 HDC 的参数。要不然你会说,一个简单的 CDC 类为什么那么依赖上下文设备了第二,你所需要的代码是图片合并再保存
人家的代码是需要加载图片(可能合并)然后直接绘图呈现给用户看的,跟你的需求不一样,所以你不能怪别人在哪里进行处理
要怪只能怪你自己看不懂函数体里面的代码而如果你看懂了里面的代码,那么你管它是在哪处理的,你只要把方法搬过来,然后你自己写个函数不就行了
而如果你看不懂,那么就算人家给你代码了,你也会说人家的方法不对啊,为什么那么依赖上下文设备目前我还没发现哪个类或者哪个函数能不用场景设备来进行图片的处理
//创建一个位图,用来保存合成后的图像
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
}