游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4293|回复: 7

【PNG overview】PNG专题!

[复制链接]

72

主题

447

帖子

454

积分

中级会员

Rank: 3Rank: 3

积分
454
QQ
发表于 2007-1-24 11:26:00 | 显示全部楼层 |阅读模式
这段时间开始接触PNG,遇到问题的时候,在网上搜索资料总是零零碎碎,而且有很多的说法根没就是人云亦云,信手拈来,根本没有经过详细的认证是否正确,这样的例子很多。我这里搜集了一些资料,希望不要犯下相同的错误,程序部除了说明出处的以外都是自己写的,希望对大家有点帮助
因为想写的比较全面,所以分了很多的部分,一下是索引

(一)什么是PNG
1.PNG格式的概念
2.PNG的图片文件格式特性
3.PNG的应用
(二)PNG格式详细分析
1.PNG格式总览
2.PNG格式四大金刚
3.PNG格式天兵天将
4.PNG格式测试
(三)PNG格式的读写
1.C语言读写
2.MFC中Cimage类读,写,显示PNG
3.MFC中CxImage读,写,显示PNG
4.GDI+对PNG的应用
(四)PNG开放库
1.未完成
2.未完成........................


第一章 什么是PNG
1.PNG格式的概念
PNG全名Portable Network Graphics,字面上翻译过就是“可携性网络用图形”,这简单几个字已?明白定义了PNG的用途以及主要发展方向。1996年,PNG Group向W3C (World Wide Web Consortium)提出一种多媒体图形格式,重点在于改进现有JPG跟 GIF的缺点,并且提供更多新的概念与压缩模式,在提出后得到W3C的认可与推荐。在1st October, 1996,W3C正式发函公告,推荐PNG为最佳的图形格式,并且以“PNG Delivers Higher Quality Graphics for Web Page Design”这样高度推崇的文字来作为该文件的标头,看来PNG在1996年倒是相当风光。
PNG要如何发音?基本上跟“ping”的发音相同,或者是你想念做“P-N-G”也可以。PNG的非官方名称为“PNG's Not GIF”,颇挑?,但是这也反映出目前网络图形的现实状?r。怎么说呢,话说网络最常用的图形格式GIF,其专利权属Unisys所有,早在1994年底,Unysis公司就宣布,要求有支持GIF软件的作者?缴交专利费。此举对于一向以免费开放架构为主流的网络生态,杀伤力非常大。这时不少人便开始反对Unisys的作风,并且共同开发另一种图形标准,希望能完全取代GIF,而PNG(PNG's Not GIF)也就孕育而生,从1996年起加入网络图形的阵营。(摘自CSDN)

2.PNG的图片文件格式特性
  由于终极目标是为了取代GIF,因此PNG保留了大部分GIF的特性,像是Index Color、交举显示、透明区域、?外说明??等,都是GIF有的属性,而PNG在设定之初也保留了这样的原始功能。毕竟,想要取代对方,敌人会的招数自己还是得学学。
  除此之外,PNG还加入了不少GIF所?]有的新功能,包括储存全彩影像(24bit)、256级透明层次(Alpha Channel)、Gamma值信息、CRC Check、可定义的级层显示、压缩方式可以随时扩充等,都是相当棒的特性,乍看之下,比起GIF跟JPG真的进步不少。

最新更新地址
http://www.dingge.com/main/article.asp?id=24

72

主题

447

帖子

454

积分

中级会员

Rank: 3Rank: 3

积分
454
QQ
 楼主| 发表于 2007-1-24 13:33:00 | 显示全部楼层

Re:【PNG overview】PNG专题!

   2.PNG的图片文件格式特性
  由于终极目标是为了取代GIF,因此PNG保留了大部分GIF的特性,像是Index Color、交举显示、透明区域、?外说明??等,都是GIF有的属性,而PNG在设定之初也保留了这样的原始功能。毕竟,想要取代对方,敌人会的招数自己还是得学学。
  除此之外,PNG还加入了不少GIF所?]有的新功能,包括储存全彩影像(24bit)、256级透明层次(Alpha Channel)、Gamma值信息、CRC Check、可定义的级层显示、压缩方式可以随时扩充等,都是相当棒的特性,乍看之下,比起GIF跟JPG真的进步不少。(摘自CSDN)


PNG文件格式保留GIF文件格式的下列特性:

使用彩色查找表或者叫做调色板可支持256种颜色的彩色图像。
流式读/写性能(streamability):图像文件格式允许连续读出和写入图像数据,这个特性很适合于在通信过程中生成和显示图像。
逐次逼近显示(progressive display):这种特性可使在通信链路上传输图像文件的同时就在终端上显示图像,把整个轮廓显示出来之后逐步显示图像的细节,也就是先用低分辨率显示图像,然后逐步提高它的分辨率。
透明性(transparency):这个性能可使图像中某些部分不显示出来,用来创建一些有特色的图像。
辅助信息(ancillary information):这个特性可用来在图像文件中存储一些文本注释信息。
独立于计算机软硬件环境。
使用无损压缩。
  
PNG文件格式中要增加下列GIF文件格式所没有的特性:

每个像素为48位的真彩色图像。
每个像素为16位的灰度图像。
可为灰度图和真彩色图添加α通道。
添加图像的γ信息。
使用循环冗余码(cyclic redundancy code,CRC)检测损害的文件。
加快图像显示的逐次逼近显示方式。
标准的读/写工具包。
可在一个文件中存储多幅图像。


PNG vs GIF 大对决

  口口声声要取代GIF,连PNG这个名字都摆明了就是要跟死要钱的GIF作对(PNG's Not GIF),那就得拿出真本事来,来能够让使用者信服。以下分别针对各种不同属性的图片文件,做一完整的测试,比较看看,PNG是否有取代GIF的实力。(摘自pcadvance.cn)

72

主题

447

帖子

454

积分

中级会员

Rank: 3Rank: 3

积分
454
QQ
 楼主| 发表于 2007-1-24 13:36:00 | 显示全部楼层

Re: 【PNG overview】PNG专题!

测试一:全彩Photo图片

  取样标准选用短景深的花卉摄影,主要目的在于,比较能够清楚了解图与压缩过后的解像能力。前景花卉的枝叶是否轮廓清晰,而后景朦胧的部分是否清楚展现其连续色级也是重点。红跟绿的对比配色,对于颜色数限制下的色彩展现,也有相当的测试性质。 GIF 16色 7.15k GIF 32色 9.63k GIF 64色 12.9k GIF 128色 15.6k
    (看不到图片请点击查看原文)
   
PNG 16色 9.51k PNG 16色12k PNG 16色15k PNG16色 16.5k
  首先是GIF与PNG的比较。测试之后,非常无奈的发现,PhotoShop似乎没有对PNG以及GIF的压缩格式分别作最佳化。在抖色的色彩排列上,上下的比较可以很明显的看到,不论是GIF或是PNG,同一色彩数的抖色方式皆相同,也因此在画质上,两种格式完全没有差异。

  既然画质没有差异,那能够比较的只剩下图片文件大小。在全彩照片的测试中,GIF在每一个颜色数中都占尽上风,平均图片文件只要PNG的80%大小,在全彩复杂图形的压缩上保有一定的优势。PNG在这次的测试中占居第二。

  测试二:全彩Photo图片 --> 24bit图形


JPG 25-Q 5.97k JPG 50-Q 9.19k JPG 75- Q 18.9k JPG 100- Q 38.3k
        (看不到图片请点击查看原文)
   
PNG 24bit 57.5k

  PNG在规格上可以压制24bit全彩图形,所以我们也增加了与JPG的比较测试。比较方式为,JPG采用分级段缩测试,分别由25、50、75到100,而PNG方面由于PhotoShop并未提供压缩比设定,在PNG规格上亦未标明24Bit图形的压缩品质如何控制,所以仅以一个样本来做比较。(PNG栏中的四张图皆为同一张,为了方便与上面四张JPG比较而复制四份)

  测试结果发现,JPG在50的压缩品质下已经相当接近原图,而在75的压缩品质下,几乎已是很难发现压缩失真的痕迹。JPG的压缩方式在压缩全彩图片上确实优秀,而且K 数非常小,9K的画质已是吓吓叫。反观PNG,目前的24bit图片效果似乎中看不重用,图形品质虽好,但是在文件大小上的劣势却相当明显。看来24bit的PNG图形应用,还有待大力改进。(摘自mysoo.net)

35

主题

1735

帖子

1739

积分

金牌会员

Rank: 6Rank: 6

积分
1739
QQ
发表于 2007-1-25 09:19:00 | 显示全部楼层

Re:【PNG overview】PNG专题!

顶一个

72

主题

447

帖子

454

积分

中级会员

Rank: 3Rank: 3

积分
454
QQ
 楼主| 发表于 2007-2-8 12:20:00 | 显示全部楼层

Re:【PNG overview】PNG专题!

第二章  PNG格式详细分析


1.PNG格式总览

国内系统介绍PNG格式的网站很少,查找了很多资料,发现主要是来自gameres上的一篇文章,其余的网站和个人博客基本上都是摘抄这个,后来有人做了一些修改,更加完善了。我开始分析PNG也是从这篇文章开始的,非常感谢这篇文章(点击查看原文)。以下是对PNG格式的一些分析。

PNG图像格式文件(或者称为数据流)由一个8字节的PNG文件署名(PNG file signature)域和按照特定结构组织的3个以上的数据块(chunk)组成。

PNG定义了两种类型的数据块,一种是称为关键数据块(critical chunk),这是标准的数据块,另一种叫做辅助数据块(ancillary chunks),这是可选的数据块。关键数据块定义了4个标准数据块,每个PNG文件都必须包含它们,PNG读写软件也都必须要支持这些数据块。虽然PNG文件规范没有要求PNG编译码器对可选数据块进行编码和译码,但规范提倡支持可选数据块。(摘自gameres)



(看不到图片请点击查看原文)


要讲解PNG格式,就不得不拿出一张经典的PNG格式测试图(上图来自PNG测试站点),以后的很多分析内容都会围绕着这张图展开,大家下载这张图到自己的电脑上,用UltraEdit-32这类软件打开,然后来分析PNG图片的结构(以下资料来自网络)

PNG企图替代GIF和TIFF文件格式,同时增加一些GIF文件格式所不具备的特性。流式网络图形格式(Portable Network Graphic Format,PNG)名称来源于非官方的“PNG's Not GIF”,是一种位图文件(bitmap file)存储格式,读成“ping”。PNG用来存储灰度图像时,灰度图像的深度可多到16位,存储彩色图像时,彩色图像的深度可多到48位,并且还可存储多到16位的α通道数据。PNG使用从LZ77派生的无损数据压缩算法。

PNG数据块(Chunk)


(看不到图片请点击查看原文)PNG定义了两种类型的数据块,一种是称为关键数据块(critical chunk),这是标准的数据块,另一种叫做辅助数据块(ancillary chunks),这是可选的数据块。关键数据块定义了4个标准数据块,每个PNG文件都必须包含它们,PNG读写软件也都必须要支持这些数据块。虽然PNG文件规范没有要求PNG编译码器对可选数据块进行编码和译码,但规范提倡支持可选数据块。

下表就是PNG中数据块的类别,其中,关键数据块部分我们使用深色背景加以区分。

PNG文件格式中的数据块
      
数据块符号
       数据块名称  多数据块  可选否  位置限制  
IHDR  文件头数据块  否  否  第一块  
cHRM  基色和白色点数据块  否  是 在PLTE和IDAT之前
gAMA  图像γ数据块  否  是 在PLTE和IDAT之前  
sBIT  样本有效位数据块  否  是 在PLTE和IDAT之前  
PLTE  调色板数据块  否  是 在IDAT之前  
bKGD  背景颜色数据块  否  是 在PLTE之后IDAT之前  
hIST  图像直方图数据块  否  是 在PLTE之后IDAT之前  
tRNS  图像透明数据块  否  是 在PLTE之后IDAT之前  
oFFs  (专用公共数据块)  否  是 在IDAT之前  
pHYs  物理像素尺寸数据块  否  是 在IDAT之前  
sCAL  (专用公共数据块)  否  是 在IDAT之前  
IDAT  图像数据块  是 否  与其他IDAT连续
tIME  图像最后修改时间数据块  否  是 无限制  
tEXt  文本信息数据块  是 是 无限制  
zTXt  压缩文本数据块  是 是 无限制  
fRAc  (专用公共数据块)  是 是 无限制  
gIFg  (专用公共数据块)  是 是 无限制  
gIFt  (专用公共数据块)  是 是 无限制  
gIFx  (专用公共数据块)  是 是 无限制  
IEND  图像结束数据  否  否  最后一个数据块  


为了简单起见,我们假设在我们使用的PNG文件中,这4个数据块按以上先后顺序进行存储,并且都只出现一次。

数据块结构
  (看不到图片请点击查看原文)

PNG文件中,每个数据块由4个部分组成,如下:

名称  字节数  说明  
Length (长度)  4字节  指定数据块中数据域的长度,其长度不超过(231-1)字节  
Chunk Type Code (数据块类型码)  4字节  数据块类型码由ASCII字母(A-Z和a-z)组成  
Chunk Data (数据块数据)  可变长度  存储按照Chunk Type Code指定的数据  
CRC (循环冗余检测)  4字节  存储用来检测是否有错误的循环冗余码  


(看不到图片请点击查看原文)CRC(cyclic redundancy check)域中的值是对Chunk Type Code域和Chunk Data域中的数据进行计算得到的。CRC具体算法定义在ISO 3309和ITU-T V.42中,其值按下面的CRC码生成多项式进行计算:

x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1

下面,我们依次来了解一下各个关键数据块的结构吧。

72

主题

447

帖子

454

积分

中级会员

Rank: 3Rank: 3

积分
454
QQ
 楼主| 发表于 2007-2-8 12:21:00 | 显示全部楼层

Re:【PNG overview】PNG专题!

2.PNG格式四大金刚

PNG必需的关键数据块主要是有四分组成,分别是IHDR,PLTE,IDAT,IEND ,其中PLTE 数据块只是和索引彩色图像有关的,如果是RGB格式的PNG,里面可以没有PLTE数据。这样来说其实PNG数据的主要分就是三部分IHDR,IDAT,IEND-----分别是文件头,数据部分和文件结尾。

IHDR


(看不到图片请点击查看原文)文件头数据块IHDR(header chunk):它包含有PNG文件中存储的图像数据的基本信息,并要作为第一个数据块出现在PNG数据流中,而且一个PNG数据流中只能有一个文件头数据块。

文件头数据块由13字节组成,它的格式如下表所示。

域的名称  字节数  说明  
Width  4 bytes  图像宽度,以像素为单位  
Height  4 bytes  图像高度,以像素为单位  
Bit depth  1 byte  图像深度:
索引彩色图像:1,2,4或8
灰度图像:1,2,4,8或16
真彩色图像:8或16  
ColorType  1 byte  颜色类型:
0:灰度图像, 1,2,4,8或16
2:真彩色图像,8或16
3:索引彩色图像,1,2,4或8
4:带α通道数据的灰度图像,8或16
6:带α通道数据的真彩色图像,8或16  
Compression method  1 byte  压缩方法(LZ77派生算法)  
Filter method  1 byte  滤波器方法  
Interlace method  1 byte  隔行扫描方法:
0:非隔行扫描
1: Adam7(由Adam M. Costello开发的7遍隔行扫描方法)  


现在用UltraEdit-32打开上面的那张PNG格式测试图,我们开始分析它的数据结构。


此主题相关图片如下:
(看不到图片请点击查看原文)

被红色选中的头8个字节即为PNG文件的标识,它说名了这个文件是一个PNG文件。
除了被红色选中的以外的白色部分,就是IHDR自身描述的数据块了

00 00 00 0D 说明IHDR头块长为13
49 48 44 52 IHDR标识
00 00 01 00 图像的宽,256像素
00 00 01 00 图像的高,256像素
08 色深
02 颜色类型,真彩色图像
00 PNG Spec规定此处总为0(非0值为将来使用更好的压缩方法预留),表示使压缩方法(LZ77派生算法)
00 同上
00 非隔行扫描
最后的4位数据是 CRC校验码  确保以上数据的完整性
PLTE


调色板数据块PLTE(palette chunk)包含有与索引彩色图像(indexed-color image)相关的彩色变换数据,它仅与索引彩色图像有关,而且要放在图像数据块(image data chunk)之前。

PLTE数据块是定义图像的调色板信息,PLTE可以包含1~256个调色板信息,每一个调色板信息由3个字节组成:
(看不到图片请点击查看原文)
颜色
      
字节
      
意义
      

Red
1 byte
0 = 黑色, 255 = 红

Green
1 byte
0 = 黑色, 255 = 绿色

Blue
1 byte
0 = 黑色, 255 = 蓝色



因此,调色板的长度应该是3的倍数,否则,这将是一个非法的调色板。

对于索引图像,调色板信息是必须的,调色板的颜色索引从0开始编号,然后是1、2……,调色板的颜色数不能超过色深中规定的颜色数(如图像色深为4的时候,调色板中的颜色数不可以超过2^4=16),否则,这将导致PNG图像不合法。

真彩色图像和带α通道数据的真彩色图像也可以有调色板数据块,目的是便于非真彩色显示程序用它来量化图像数据,从而显示该图像。

因为这张测试图片是真彩图像,所以没有PLTE数据块。

IDAT
  (看不到图片请点击查看原文)

图像数据块IDAT(image data chunk):它存储实际的数据,在数据流中可包含多个连续顺序的图像数据块。

IDAT存放着图像真正的数据信息,因此,如果能够了解IDAT的结构,我们就可以很方便的生成PNG图像。


此主题相关图片如下:
(看不到图片请点击查看原文)
在这留白的部分就是我们的IDAT数据部分

红色选中部分表示IDAT数据块的长度
黄色部分49 44 41 54 IDAT标识
78 DA…… 压缩的数据,LZ77派生压缩方法
绿色部分是 CRC校验

IEND


图像结束数据IEND(image trailer chunk):它用来标记PNG文件或者数据流已经结束,并且必须要放在文件的尾部。

如果我们仔细观察PNG文件,我们会发现,文件的结尾12个字符看起来总应该是这样的:

00 00 00 00 49 45 4E 44 AE 42 60 82

不难明白,由于数据块结构的定义,IEND数据块的长度总是0(00 00 00 00,除非人为加入信息),数据标识总是IEND(49 45 4E 44),因此,CRC码也总是AE 42 60 82。

至此,我们已经能够从一个PNG文件中识别出各个数据块了。由于PNG中规定除关键数据块外,其它的辅助数据块都为可选部分,因此,有了这个标准后,我们可以通过删除所有的辅助数据块来减少PNG文件的大小。(当然,需要注意的是,PNG格式可以保存图像中的层、文字等信息,一旦删除了这些辅助数据块后,图像将失去原来的可编辑性。)

比如说下面这个图形数据,里面除了我们上面所提到的四块数据以外,还有很多的辅助数据

(看不到图片请点击查看原文)

3.PNG格式的天兵天将

我们选择网上的一张图片作为讲解PNG辅助格式的图片素材,这个素材是8*8的,看起来很小,放大以后效果如下图,不过查看数据格式的时候还是要用UltraEdit-32打开。


主要的数据块我们就不讲了,现在看看辅助数据

00000021~0000002F:


(看不到图片请点击查看原文)


可选数据块sBIT,颜色采样率,RGB都是256(2^8=256)

00000030~00000062:

(看不到图片请点击查看原文)



这里是调色板信息

00 00 00 27 说明调色板数据长为39字节,既13个颜色数
50 4C 54 45 PLTE标识 (开始那张图片上面没有PLTE数据块,这张图片有)
FF FF 00 颜色0
FF ED 00 颜色1
…… ……
09 00 B2 最后一个颜色,12
5F F5 BB DD CRC校验
00000063~000000C5:



  (看不到图片请点击查看原文)

这部分包含了pHYs、tExt两种类型的数据块共3块,由于并不太重要,因此也不再详细描述了。

26

主题

537

帖子

537

积分

高级会员

Rank: 4

积分
537
发表于 2007-2-9 09:26:00 | 显示全部楼层

Re:【PNG overview】PNG专题!

事实上从测试就可以看出,PNG已经把自己推到了一个比较尴尬的位置。

它既然为取代GIF而诞生,就该在支持同等色彩模式的前提下改进压缩算法,只要在压缩比和速度两方面胜过GIF而其它性能保持一致,GIF就会在专利到期前就寿终正寝。可是PNG偏要在色彩方面也要压人一头,质量与压缩率本就是矛盾的,怎可兼得?

何况,既要支持高彩模式,又要压缩率高,还要无损压缩,这样的需求只有在类似游戏这样很少数应用领域才会被提出。所以“可携性网络用图形”倒不如改称为“游戏用完美图形”。

20

主题

94

帖子

103

积分

注册会员

Rank: 2

积分
103
发表于 2007-2-9 21:31:00 | 显示全部楼层

Re:【PNG overview】PNG专题!

“游戏用完美图形”---那应该叫GPG文件~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-26 10:39

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表