之前上传过一个资源,关于任意格式转换为Bmp格式的。今天发现很多反馈都是代码看不明白。先在专门详细给大家讲解一下。
BMP, ICON, GIF, JPEG, Exif, PNG, TIFF, WMF, and EMF这里面的任何两种格式都可以用介绍的方法任意转换。
该转换方案要得益于GDI+的Image类,提供的按照图片编码方式保存图片的功能。记得很久以前查过资料,对于以上所说的图片格式,在系统注册表中是保存有对应格式的编码方式的,不然操作系统如何去认识如上的图片格式的了?
知道如上这点,我们的解决方案就很简单了,因为我们只需要从系统中找到对应格式图片的编码方式,然后调用Image类的保存功能,即能实现我们的图片格式转换需求。
1.加载GDI+库
评论中反馈没有GDI+库,工程中是有加载的,具体的GDI+库,如果电脑上没有,需要自己去加载了。GDI+加载释放分别在app的InitInstance和ExitInstance函数中。
2.获取图片格式的编码信息
BOOL CJpgToBmpDlg::GetImageCLSID(const WCHAR *format, CLSID *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) {//编码方式的具体描述 if(wcscmp(pImageCodecInfo[i].MimeType,format)==0) { *pCLSID = pImageCodecInfo[i].Clsid; free(pImageCodecInfo); return TRUE; } } free(pImageCodecInfo); return FALSE; }如上代码,我想细心看,还是能够看懂,就是为了获取给定图片格式的编码方式。从系统中提取到所有图片格式列表,然后逐个的去找与查找的图片格式匹配的格式编码。
3.按照图片编码,保存图片
Graphics graphics(NULL); Image image(L"c:\\test.xxx"); CLSID clsid; if (GetImageCLSID(L"image/xxx",&clsid)) { image.Save(L"c\\dst.xxx",&clsid,NULL); }这里的xxx,即为所需的图片格式。