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

1845 人浏览 | 时间: 2015-12-13 19:46:33 | 作者: 阿郎
图形文件的解码器实现了GDI+对不同格式的图形文件的不同处理方式,比如,打开BMP位图文件的方法就和打开JPEG文件的方法不一样,因为两者的文件头结构信息不同。所以,不同的图片文件的解码方式也是不一样的,对于图片的内部存储结构,请看《位图图片内部存储详解》。

ImageCodecInfo对象存储了图像文件的编码与解码的所有信息,其具体的数据成员及所标示的编码器信息如下所示:

下面我们看看目前系统支持的所有的图形文件编码信息:

void C油表View::OnSavecodeinfo()
{
	// TODO: 在此添加命令处理程序代码
	UINT num;
	UINT size;
	////获取系统支持的图形文件的编码信息
	GetImageEncodersSize(&num, &size);
	ImageCodecInfo* encoderInfo = (ImageCodecInfo*)malloc(size);
	GetImageEncoders(num, size, encoderInfo);

	WCHAR clsid[40], formatID[40];
	DWORD sigCount, sigSize;
	UINT j = 0, k = 0;
	CString info, tmp;
	CFile tmpfile(L"C:\\文件编码信息.txt", CFile::modeCreate|CFile::modeReadWrite);
	CStringW test;
	for (j = 0; j < num; j++)
	{
		tmp.Format(L"开始描述第%d中图形编码信息\r\n", j);
		info += tmp;
		StringFromGUID2(encoderInfo[j].Clsid, clsid, 40);
		StringFromGUID2(encoderInfo[j].FormatID, formatID, 40);
		tmp.Format(L"编码标识:%s\r\n", clsid);
		info += tmp;
		tmp.Format(L"文件标识:%s\r\n", formatID);
		info += tmp;
		tmp.Format(L"编码器名称:%s\r\n", encoderInfo[j].CodecName);

		info += tmp;
		tmp.Format(L"编码器依存的动态链接库名:%s\r\n", encoderInfo[j].DllName);
		info += tmp;
		tmp.Format(L"编码器描述:%s\r\n", encoderInfo[j].FormatDescription);
		info += tmp;
		tmp.Format(L"编码器对用的文件拓展名:%s\r\n", encoderInfo[j].FilenameExtension);
		info += tmp;
		tmp.Format(L"编码器的MIME类型描述:%s\r\n", encoderInfo[j].MimeType);
		info += tmp;
		tmp.Format(L"ImageCodeFlags枚举的标记集:%x\r\n", encoderInfo[j].Flags);
		info += tmp;
		tmp.Format(L"编码器版本:%u\r\n", encoderInfo[j].Version);
		info += tmp;

		sigCount = encoderInfo[j].SigCount;
		sigSize = encoderInfo[j].SigSize;
		tmp.Format(L"于编码器对应的文件格式标记总数:%u\n", sigCount);
		info += tmp;
		tmp.Format(L"标记的样式信息\r\n:");
		info += tmp;
		for (k = 0; k < sigCount*sigSize; ++k)
		{
			tmp.Format(L"\t标记掩码%d:%x\r\n", k, encoderInfo[j].SigMask[k]);
			info += tmp;
		}
		tmp.Format(L"第%d种图形编码信息描述完毕\r\n", j);
		info += tmp;
		CString ee(info);
		info.Empty();
		test += ee;
	}
	free(encoderInfo);
	////将所有的编码信息写入文件
	WORD unicode = 0xFEFF;  //这句重要
	tmpfile.Write(&unicode, 2);  //这句重要
	tmpfile.Write(test.GetBuffer(), test.GetLength());  //这句重要
}
代码实现:

StringFromGUID2函数将GUID数据类型转换成字符串。

因为输出的信息比较多,导致无法在一个窗口中完整的输出所有的图形文件的编码信息,因此需要将输出信息保存在文件中。