图片格式转换自己轻松搞定

        之前上传过一个资源,关于任意格式转换为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,即为所需的图片格式。

你可能感兴趣的:(图片格式转换自己轻松搞定)