摘 要 运用 libpng 库函数,设计了一个可读写 PNG 格式图像的 C++类。同时,在 VC++6.0 开
发平台下,设计出一个基于多文档结构的图像浏览器,实现 PNG 格式图像的读写及显
示。
关键词 PNG, 图像格式,C++,类
一、前言
PNG 是一种可携式网络图像格式(Portable Network Graphic Format,PNG),其名称来源于非
官方的“PNG's Not GIF”,是一种位图文件(Bitmap file)存储格式,读成“ping”[1]。在 20 世
纪 90 年代, GIF 已经普遍使用,然而在 1995 年新年前后,Unisys 和 CompuServe 两家公司突然
宣布编程使用 GIF 均需要向其支付版税,理由是他们拥有 LZW 压缩算法(GIF 格式采用该算法)的
版权。付费问题,迫使众多开发人员设计和开发新的用以代替 GIF 的图像格式。PNG 出现的初衷就
是为了替代 GIF 文件格式,避免支付版税。因此,设计 PNG 时,保留了 GIF 的众多特性,如(1)
使用彩色查找表(也称调色板)可支持 256 种颜色的彩色图像;(2)流式读/写性能(Streamability);
(3)逐次逼近显示(Progressive display);( 4)透明性(Transparency);( 5)使用无损压缩等。
同时,也增加了一些 GIF 文件格式所不具备的特性,如(1)每个像素为 48 位的真彩色图像;(2)
每个像素为 16 位的灰度图像;(3)可为灰度图和真彩色图添加α通道;(4)添加图像的γ信息;
(5)使用循环冗余码(Cyclic redundancy code,CRC)检测损害的文件;(6)加快图像显示的逐
次逼近显示方式;(7)标准的读/写工具包等。目前,PNG 已成为国际互网络联盟(World Wide Web
Consortium ,W3C)推荐的标准[2],是互联网中常用的图像格式之一,常见的绘图软件和浏览器均
支持 PNG 图像浏览(其中 IE 4.0 以上版本均支持 PNG)。本文利用 http://www.libpng.org 提供
的 libpng 库[3],设计一个可读写 PNG 图像的 C++类,同时利用 VC++6.0 开发平台,通过 PNG 图像
浏览器的实例设计,说明 PNG 类的使用方法。
二、PNG 文件结构
PNG 图像由一个 8 字节的 PNG 文件署名(PNG file signature)域和按照特定结构组织的 3 个以
上的数据块(Chunk)组成。PNG 文件署名域是用来识别该文件是不是 PNG 文件,如果用十进制数表
示,该域的值依此是 137, 80, 78, 71, 13, 10, 26, 10,(对应的十六进制数为 89,50,4e,
47,0d, 0a,1a,0a)。PNG 数据块由表 1 所示的 4 个域构成[2]。根据类型的不同,PNG 数据块
又可分为两种:一种是关键数据块(Critical chunk),这是标准的数据块,另一种叫做辅助数据块
(Ancillary chunks),是可选的数据块。其中,关键数据块又定义了 4 个标准数据块,分别为(1)
文件头数据块 IHDR(Header chunk);(2)调色板数据块 PLTE(Palette chunk);(3)图像数据块
IDAT(Image data chunk);(4)图像结束数据 IEND(Image trailer chunk)。由于篇幅限制,这
里只介绍与编程设计最为密切的文件头数据块结构,具体见表 2,其他数据块格式可参考文献[2]。
表 1 PNG 数据块的结构
评论6