当前位置:C++技术网 > 资讯 > 图形文件的编码与解码的学习2

图形文件的编码与解码的学习2

更新时间:2015-12-13 19:55:10浏览次数:1+次

在保存图形文件时,往往需要对保存图像时的许多附加参数进行处理。比如,在使用windows的“画图”程序保存一个BMP文件时,程序回跳出这样的对话框:


用户可以对文图文件进行不用的属性设置:单色位图,16色位图,24色位图等。这些属性是BMP文件编码参数的一个组成部分。编码参数约束GDI+保存图片文件,程序开发人员可以通过在程序中为编码器知名不用的编码参数,实现文件的不同保存形式。
但如何才能知道,再保存一个图形文件时候,有哪些编码参数是可以设置的?这些参数又是怎样的在对文件编码时启用?
用户可以使用Image类的成员函数GetEncoderParameterList进行比那吗参数信息的详细查询。在使用GetEncoderParameterList函数之前,应该使用GetEncoderParameterListSize函数进行参数信息列表大小的查询。
GetEncoderParameterListSize函数返回描述特定图形文件编码信息参数的大小,以字节为单位。
UINT GetEncoderParameterListSize(const CLSID* clsidEncoder);
clsidEncoder:编码器的类标识
Status GetEncoderParameterList(const CLSID* clsidEncoder, UINT size, EncoderParameters* buffer);
clsidEncoder:编码器的类标识。
size:编码信息的总大小
Buffer:保存编码具体参数列表信息的地址
GetEncoderParameterList函数返回的是一个指向EncoderParameters对象的地址。参数集是所有的斑马参数的集合。
通常情况下,在编程中如需获取编程器参数列表,都需要制定图形文件编码器的类标识(CLSID)。编码器的类标识是一个常数,但是GDI+中没有一个函数能够直接返回指定格式的图形文件的编码器标识。所以,为例方便对指定格式的文件编码器的类标识进行灵活查找,有必要自己建立一个GetEncoderClsid,来获取特定文件的编码器类标识。
int C油表View::GetEncoderClsid(WCHAR* format, CLSID* pClsid)
{
	UINT  num = 0;
	UINT  size = 0;
	ImageCodecInfo* pImageCodecInfo = NULL;
	GetImageEncodersSize(&num, &size);
	if (size == 0)
		return -1;

	pImageCodecInfo = (ImageCodecInfo*)(malloc(size));
	if (pImageCodecInfo == NULL)
		return -1;

	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;
		}
	}
	free(pImageCodecInfo);
	return -1;
	//return 0;
}