图形文件的解码器实现了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数据类型转换成字符串。
因为输出的信息比较多,导致无法在一个窗口中完整的输出所有的图形文件的编码信息,因此需要将输出信息保存在文件中。