图形的编码与解码
程序设计中,与编码和解码紧密相关的3个概念就是“文件头”, “文件体”, “文件尾”。
1、认识编码与解码(png为例)
PNG图像文件格式由一个8字节的PNG文件签名域和按照特定结构组织的3个以上的数据块组成。PNG定义了两种类型的数据块,一种称为关键数据块,标准数据块; 一种称为辅助数据块, 可选数据块。
2、PNG文件的数据块结构
①、关键数据块
②、辅助数据块
③、数据块摘要
3、获取图像文件的编码器信息
GDI+提供GetImageEncoders(获取图像编码)和GetImageDecoders(获取图像解码)函数对系统的解码器信息逐一查询。
注:在GDI+中有关编码和解码信息的获取, 基本上都是按照上述思路进行的。即在获取信息之前, 应该为信息的存放分配足够的内存空间。
例程:演示对系统可用的编码器进行简单查询
例程:查询并保存目前系统支持的所有的图形文件编码信息
④、获取图形文件的解码器以及编码参数信息
例程:列出系统可用的图片解码器信息
处理图形文件的编码参数
获取指定的图像格式的编码类标识函数
通常情况下, 在编程中如需要获取编程器参数列表, 都需要指定图像文件编码器的类标识符(CLSID)。编码器的类标识符是一个常数, 三是在GDI+中没有一个函数可以直接返回指定格式的图形文件的编码器类标识。所以, 为了方便对指定格式的图形文件编码器的类标识灵活查询, 有必要建立一个函数GetEnciderClsid, 来获取指定文件的的编码器类标识。例程:
在使用GetEncoderClsid函数时, 只需要指定具体的图形文件格式, 就能获取文件到该格式的
编码器类标识。调用方式如下:
CLSID encoderclsid,
GetEncoderClsid(L”image/jpeg“, encoderclsid);
例程:演示对jpeg文件进行编码(保存)时, 应用程序可以设置的编码参数。
还原有关的编码参数
将BMP文件保存为PNG文件
例程:
将BMP文保存为jpeg文件
GDI+对jpeg文件的保护
例程:
保存多帧图片
例程:
从多帧图片文件中提取子图片
例程:
5、获取图像的属性信息
图像的属性信息是指所有构成图片的数据元素。
文件属性名实际上对应的是一个常量, 所以属性名也称为属性标记。
例程:获取文件属性标记
与GetPropertyItem函数向对应的是, GDI+也提供了得意图片属性信息进行修改的函数SetPropertyItem, 调用格式为:
status SetPropertyItem(const ProPertyItem *item);
例程:
6、使用图像属性和解码器显示GIF文件
Image类的成员函数SeleActiveFrame将多帧图片中的子侦图片按照页的顺序进行子侦的逐一督促和, 实现步骤为:
Image multi(L”MultiFrame.tif“)
// 按页的顺祝逐一读取
GUID pageGuid = FrameDimensionPage;
multi.SeleActiveFrame(&pageGuid , 0);
GIF文件对其子侦的读取顺序是按照时间顺序进行的, 对应的GUID应该是由GDI+的”帧维常量“列举的另一个常量FrameDimensionTime(帧维时间)
例程:
初始化帮助对话框,
2、在wm_timer事件中显示GIF文件
7、GDI+在多格式图像转换程序中的运用
显示: