2024年5月29日发(作者:)
利用C++类实现PNG图像读写及显示
一j誉
摘要:运用libpng库函数,设计了一个可读写PNG格式图像的c++类.同时,在
VC++6.0开发平台下,设计出一个基于多文档结构的图像浏览器,实现PNG格式图像的
读写及显示.
关键词:PNG;图像格式;C++;类
一
,前言
PNG是一种可携式网络图像格式,其名称来源于非官方的
“PNG’SNotGIF”,是一种位图文件(Bitmapfile)存储格式,读
成”ping”.设计PNG时,保留了GIF的众多特性,如(1)
使用彩色查找表(也称调色板)可支持256种颜色的彩色图
像;(2)流式读/写性能(Streamability);(3)逐次逼近显示
(Progressivedisplay);(4)透明性(Transparency);(5)使用
无损压缩等.同时,也增加了一些GIF文件格式所不具备的特
性,如(1)每个像素为48位的真彩色图像;(2)每个像素为
l6位的灰度图像;(3)可为灰度图和真彩色图添加通道;
(4)添加图像的信息;(5)使用循环冗余码(Cyclicredun—
dancycode,CRC)检测损害的文件;(6)加快图像显示的逐次
逼近显示方式;(7)标准的读/写工具包等.目前,PNG已
成为国际互网络联盟(WorldWideWebConsortium,W3C)推荐的
标准[2],是互联网中常用的图像格式之一,常见的绘图软件
和浏览器均支持PNG图像浏览(其中IE4.0以上版本均支持
PNG).本文利用提供的libpng库
【3】,设计一个可读写PNG图像的C++类,同时利用
VC++6.0开发平台,通过PNG图像浏览器的实例设计,说
明PNG类的使用方法.
二,PNG文件结构
PNG图像由一个8字节的PNG文件署名(PNGfilesigna-
ture)域和按照特定结构组织的3个以上的数据块(Chunk)组
成.PNG文件署名域是用来识别该文件是不是PNG文件,如
果用十进制数表示,该域的值依此是137,80,78,71,13,10,
26,l0,(对应的十六进制数为89,50,4e,47,Od,0a,
1a,0a).PNG数据块由表1所示的4个域构成【2].根据类
型的不同,PNG数据块又可分为两种:一种是关键数据块
(Criticalchunk),这是标准的数据块,另一种叫做辅助数据块
(Ancillarychunks),是可选的数据块.其中,关键数据块又定
义了4个标准数据块,分别为(1)文件头数据块IHDR
(Headerchunk);(2)调色板数据块PLTE(Palettechunk);
(3)图像数据块IDAT(Imagedatachunk);(4)图像结束数据
IEND(Imagetrailerchunk).由于篇幅限制,这里只介绍与编程
设计最为密切的文件头数据块结构,具体见表2.
表1PNG数据块的结构
名称字节数说明
指定数据块中数据域的长度,其长
Length(长度)4度
不超过(2~1)字节
ChunkTypeCode数据块类型码由ASCII字母(A-Z
(数据块类型码)4和a—z)组成
ChunkData(数据块可变长度存储按照ChunkTypeCode指定的
数据)数据
CRC(循环冗余检存储用来检测是否有错误的循环4
测)冗余码
表2文件头数据块的结构
名称字节数说明
Width(宽度)4图象宽度(单位:像素,0为无效值)
Height(长度)4图象高度(单位:像素,0为无效值)
索引彩色图象:1,2,4或8Bi
tdepth
l灰度图象:1,2,4,8或16
(图象深度)真彩色图象
:8或16
O:灰度图象,
2:真彩色图象
Colortype
l3:索引彩色图象(颜色类型
)4
:带a通道数据的灰度图象
6:带a通道数据的真彩色图象
Compressionmethod显示所用压缩方法,国际标准中只定义
f压缩方法)l了一种方法(method0)
Filtermeth0d
1滤波器方法
(滤波器方法)
Interlacemeth0d0:非隔行扫描:1:Adam7(由Adam
(隔行扫描方法)lo开发的7遍隔行扫描方法
{tt…i∞』t_’tMt -I
实用第一/智慧密集
三,PNG类设计
设计一个名为MyPNG的类,图像,对应函数为Draw(CDC
pDC,intnX=0,intnY=0,intnWidth=一1,intnHeight=
一


发布评论