回 帖 发 新 帖 刷新版面

主题:[原创]png图片文件的数据结构以及转换为位图的源代码

        png文件的数据结构

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

一、数据结构

1.PNG数据块
    PNG定义了两种类型的数据块,一种是称为关键数据块,这是标准的数据块,另一种叫做辅助数据
块,这是可选的数据块。关键数据块定义了5个标准数据块,每个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 *   图像结束数据块   否    否   最后一块  
--------------------------------------------------------------
  除了关键数据块,其它的数据块都是可有可无的。


2.数据块结构
    PNG文件中,除了PNG文件标识外,所有的数据块均由4个部分组成,如下表:
----------------------------------------------------------------------
顺号 名称      字节数  说明  
----------------------------------------------------------------------
1长度     4    指定第3部分数据域的长度  
2数据块符号  4     由数据块符号的 Ascii 码组成  
3数据域     不定     存储按照 Chunk Type Code 指定的数据  
4CRC校验     4    又称循环冗余检测,用来检测是否有错误
----------------------------------------------------------------------
  循环冗余检测中的值是对第2部分数据块符号和第3部分数据域进行计算得到的,具体算法定义在
ISO 3309 和ITU-T V.42中,其值按下面的 CRC 码生成多项式进行计算:
    x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1

3.5个关键数据块的具体结构。

①PNG文件标识
  它固定为8个字节:89 50 4E 47 0D 0A 1A 0A,前4个字节为“.PNG”的 Ascii 码。

②文件头数据块
  它包含有 PNG 文件中存储的图像数据的基本信息,并要作为第二个数据块出现在 PNG 数据流中,
一个 PNG 数据流中只能有一个文件头数据块。格式如下表所示。
-----------------------------------------------------
域名称   字节数  说明  
-----------------------------------------------------
数据域长度  4   指定数据域的长度,固定为00 00 00 0D
数据块符号  4    49 48 44 52,是“IHDR”的 Ascii 码
 (以下13个字节是数据域)
图像宽度   4   单位:像素
图像高度   4   单位:像素
颜色深度   1    灰度图像:1、2、4、8 或 16 
            真彩色图像:8 或 16
          索引彩色图像:1、2、4 或 8 
          带α通道数据的灰度图像:8 或 16
          带α通道数据的真彩图像:8 或 16
颜色类型   1   灰度图像:0
            真彩色图像:2
            索引彩色图像:3
            带α通道数据的灰度图像:4
            带α通道数据的真彩色图像:6
压缩方法   1    规定此字节为0(使用LZ77派生算法压缩)
滤波器方法   1   通常此字节为0
隔行扫描方法 1   非隔行扫描:0 
            Adam7(7遍隔行扫描方法):1
CRC校验     4
-----------------------------------------------------

③调色板数据块
  包含有与索引彩色图像相关的彩色变换数据,它仅与索引彩色图像有关,而且要放在图像数据块之
前。它定义图像的调色板信息,其数据结构如下:
----------------------------------------------------------------------
域名称     字节数  说明  
----------------------------------------------------------------------
数据域长度  4    指定数据域的长度
数据块符号  4     50 4C 54 45,是“PLTE”的 Ascii 码
数据域     不定     n个调色板,就有3×n个字节长度,最多 3×256 字节  
CRC校验     4
----------------------------------------------------------------------
  每一个调色板由表示红、绿、蓝信息的3个字节组成,因此,调色板的长度应该是3的倍数,否则
就是非法的调色板。
    对于索引图像,调色板信息是必须的,调色板的颜色索引从0开始编号,然后是1、2……,调色
板的颜色数不能超过文件头数据块中“颜色深度”规定的颜色数(例如图像色深为4时,调色板中的颜
色数不可超过2^4=16),否则将导致 PNG 图像不合法。
    真彩色图像和带α通道数据的真彩色图像可以有调色板数据块,目的是便于非真彩色显示程序用它
来量化图像数据,从而显示该图像,也可以不要调色板。

④图像数据块
  它存储实际的数据,在数据流中可包含多个连续顺序的图像数据块。其数据结构如下:
--------------------------------------------------------
域名称     字节数  说明  
--------------------------------------------------------
数据域长度  4    指定数据域的长度  
数据块符号  4     49 44 41 54,是“IDAT”的 Ascii 码
数据域     不定    存放着图像真正的数据信息(压缩的)   
CRC校验     4
--------------------------------------------------------
  由于图像数据块是压缩数据,如果你能够掌握压缩和解压缩的方法,那么你就能轻易而举地将其它
类型的图片转换成PNG图片,或者将PNG图片转换成其它类型的图片。

⑤图像结束块
  它用来标记PNG文件或者数据流已经结束,必须要放在文件的尾部。其数据结构如下:
--------------------------------------------------------
域名称     字节数  说明  
--------------------------------------------------------
数据域长度  4    全为0:00 00 00 00
数据块符号  4     49 45 4E 44,是“IEND”的 Ascii 码
数据域     
CRC校验     4    AE 42 60 82
--------------------------------------------------------
    

二、一个具体的例子
    用系统画图新建一个8×8像素的图像,填充红色,另存为PNG图片,该图片全部数据如下(注:因
设备差异,你的数据也许会有微小不同):

000000: 89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52
000010: 00 00 00 08 00 00 00 08 08 02 00 00 00 4B 6D 29
000020: DC 00 00 00 01 73 52 47 42 00 AE CE 1C E9 00 00
000030: 00 04 67 41 4D 41 00 00 B1 8F 0B FC 61 05 00 00
000040: 00 20 63 48 52 4D 00 00 7A 26 00 00 80 84 00 00
000050: FA 00 00 00 80 E8 00 00 75 30 00 00 EA 60 00 00
000060: 3A 98 00 00 17 70 9C BA 51 3C 00 00 00 17 49 44
000070: 41 54 18 57 63 FC CF 80 03 00 25 B0 22 EC A2 20
000080: 63 06 52 07 00 11 99 38 C9 DB F8 06 FD 00 00 00
000090: 00 49 45 4E 44 AE 42 60 82

分析:

000000-000007:这8个字节为 PNG 文件标识。

000008-000020:文件头数据块,其中:
    00 00 00 0D:数据域长度为13字节
    49 48 44 52:文件头数据块符号“IHDR” 
    00 00 00 08:图像宽8像素 
    00 00 00 08:图像高8像素 
    08:24位颜色深度
    02:颜色类型为真彩 
    00:使用压缩 
    00:滤波器方法,通常为0 
    00:非隔行扫描
    4B 6D 29 DC:CRC校验码 

000021-00002D:可选数据块 sRGB

00002E-00003D:可选数据块 gAMA(图像γ数据块)

00003E-000069:可选数据块 cHRM(基色和白色点数据块)

00006A-00008C:IDAT数据块,其中:
    00 00 00 17:数据域长度为23字节 
    49 44 41 54:IDAT数据块标识“IDAT”
    18 57 63… :压缩的数据 
    DB F8 06 FD:CRC校验码

00008D-000098:IEND数据块,如上所说,固定为 00 00 00 00 49 45 4E 44 AE 42 60 82

    由于 PNG 中规定除关键数据块外,其它的辅助数据块都为可选的,因此,我们可以用Hex编辑器来
对这些数据做增删试验(Hex编辑器下载地址:http://bbs.pfan.cn/post-249666.html)
  
1.为图片减肥:利用Hex编辑器的删除功能,删除000020-000069这3个辅助数据块,文件字节数由原
来的153字节缩减到80字节,而并不影响图像的内容!试试看,你成功了吗?
  但要注意的是,PNG 格式可以保存图像中的层、文字等信息,一旦删除了这些数据后,图像将失去
原来的可编辑性。

2.添加文本信息:增加这么一个字符串“PNG图片”,字符串的Ascii码是50 4E 47 CD BC C6 AC,共7
个字节,所以数据域长度应为00 00 00 07,数据块符号是“tEXt”,Ascii是74 45 58 74,至于CRC校
验码,我们随便写4个字节,就写 BA 2D 29 CC 吧!这些信息全合起来就是:
  00 00 00 07 74 45 58 74 50 4E 47 CD BC C6 AC BA 2D 29 CC
共19字节。由于tEXt数据块可以出现在任意数据块之间,我们就利用Hex编辑器的插入功能把这19个字
节从000068插入吧,然后另存为,再用附件中的代码打开它,我们就不禁可以看到图像,还可以看到这
7个字符文本了!


三、附件
  附件中的类模块不是我的原创,我只是进行了大规模的修改。这个类模块的作用是将 PNG图片转换
为 BMP位图。其中的辅助数据块我只保留了文本信息,其它的统统删除了。
  调用类模块有4个参数,第一个是必须的,其它3个是可选的。

回复列表 (共6个回复)

沙发

顶一下

板凳

除了麻烦还是麻烦,不过顶下!~

3 楼

好贴!解析指纹类的软件用的也应该使这个技术了

4 楼

soft215@163.com,销售工程造价,建筑,工控,模拟分析,财务等商业版软件︻◣
⊿加密狗专业复制 ROCKEY6、深思4(可提供单机远程硬件复制)、彩虹天地(PDL、UDA、UMH、UMC、UMI、NH、MF)-硬件复制、阿拉丁、域天、蓝宇风全系列、 SUPPER圣天偌原狗改模块、试用狗注册等,注册机制作服务,提供程序OEM制作服务
Flexsim交通物流仿真软件 
MicroStation交通土木工程 
MicroStation CAD设计软件 
SmartSketch 智能二维绘图 
CADdy++ 计算机辅助电气设计软件
EnergyPlus 建筑能耗仿真软件
tasking for C166/ST10 v7.0
PFC2D/3D、UDEC、3DEC、FLAC2D/3D
Hyper Works Lsdyna、Pamcrash、Pamstamp
FluidSIM Pneumatik 和 FluidSIM Hydraulik
CarSim / TruckSim / BikeSim / Suspe nsionSim
SPSS,SAS,BMDP,SYSTAT,TSP,Statistica,DPS
SCA(FLAC、FLAC3D、UCEC、3DEC、PFC2D、PFC3D)
Microstran; coldes and limcon、Rapt、Etabs、slabs
PIPEPHASE/PRO/II/DATACON/HEXTRAN/INPLANT/Visual Flow/LightWave 3D, 
MSC-ADAMS、MSC-PATRAN-DYTRAN、MSC-MARC、ANSYS STEPS、RADAN 和TopSolid
Cinema4D、Houdini、ZBrush、Poser、Silo、Mirai、JewelCAD、rhino、jcad3
AutoCAD, Inventor, VIZ, CADdy++, HICAD, Lightscape,CATIA,IDEAS,HDSHM
Pro/E,Microstation,Unigraphics,SolidWorks,ALLPLANT FT,Lightscape、sb3ds
OpenCV, Optimas, XCaliper, Image Pro,Sentinel ,Matrox. 和National Instrument、
3dsmax, ALLPLAN, ArcView, AutoCAD, Autodesk Architectual Desktop, Autodesk Inventor,
Autodesk Mechanical Desktop, Autodesk VIZ, AVS/Express, CADdy++, CATIA, Cinema 4D,
Design Studio, Extreme 3D, HICAD, Houdini, I-DEAS Master Series, Lightscape, ZenCAD 
建筑能耗模拟软件DOE-2、BLAST、COMBINE、TRNSYS、ESP、HVACSIM+、EnergyPlus、SPARK、TRACE 等
ADAMS、ADAMS ATV、LifeMOD、cadence、Silvaco TCAD和ISE TCAD、excess plus、MADYM、CAM350
ADAMS/ATV、GelCompar II、Treecon W、MINTS、sysweld、AccelChip DSP、TRIBON M2/TRIBON M3
DEPOCAM,VISI,ProCAM,GIBBSCAM,AlphaCAM,PowerMill,ArtCAM,MasterCAM,Cimatron、 VRPlatform
FE-Safe, MSC Fatigue, nCode,Abaqus, ADINA, HyperWork, Algor, COSMOS、optsim4.6、VTFLINC、
eVSion、ANSYS, ANSYS Workbench, ANSYS ICEMCFD, ANSYS LS-DYNA, ANSYS CFX、ansys emag、hexsight、 
BikeSim、CAD、CAPP、PDM、ERP,Inventor,AutoCAD 、MDT,Dynaform、Autoform、PAM-Stamp、Surpac\Gemcon、
FLOW 3D、中望,PKPM,浩辰ICAD, (基于AUTOCAD)天正,理正,园方,天奇,3DMAX ArchiCAD、samcef rotor、FluidSIM、
refprop、XP-SWMM、Logocad Triga, Maya NT, MicroStation J, Mirai, Patran, Pro/ENGINEER, Pro/Mechanica 
美国NREC软件
Clementine10数据挖掘工具
Synopsys NanoSim(混合信号仿真)
MAGSOFT FLUX 2D/3D
Adams 与 SimPack 多体动力学仿真
MSC Patran、MSC Natran、MSC Marc有限元 
Citrix 集中式网络环境集成软件 
Ekahau 无线网络最佳定位及布建软件 
OPNET 网络及通讯模拟分析软件 
Testing Tech 通讯测试软件 
WRQ Reflection 终端机模拟软件 
Crystal Ball 蒙地卡罗模拟软件 
ANSYS AUTODYN6.0 非线性显式动力学软件
三维软件NewTek Lightwave 
TGNET 气体管道仿真软件
XCaliper6.1机器视觉软件开发包
AutoReaGas 三维计算流体分析软件
EQS 社会及行为科学统计软件 
JETCAM钣金设计加工软件
钣金展开软件AutoPol 
钣金数控编程软件JetCAM 
激光器设计软件LASCAD
EViews 预测分析计量软件 
GAUSS 数值分析与统计计量软件 
LIMDEP 经济计量分析软件 
LISREL 线性/非线性规划分析软件 
MINITAB 统计制程分析软件 
NWA 统计制程管制工具 
Ox/PcGive/Stamp 经济计量分析软件 
QSR 质性分析软件 
SYSWELD 数值模拟软件
Faciliworks 企业维护管理软件 
RATS 时间序列统计计量软件 
SCA 时间序列预估软件 
XFDTD 电磁场分布及分析软件 
EndNote 书目管理软件 
Lahey Fortran 程式语言编辑器 
PCTeX 学术文章排版软件 
Scientific Workplace 科学排版软件 
Simscript 非连续事件模拟语言软件 
GoCAD v2.1 用于三维构造建模,油藏建模和二次开发
TSP 时间序列数据软件 
DecisionPro 决策分析与智能网站建构软件 
Expert Choice AHP 专家决策分析软件 
Shazam 经济计量分析软件 
SigmaPlot/SigmaStat 统计分析绘图软件 
Stata 数据管理统计绘图软件 
StatXact/LogXact 无母数分析软件 
Systat 统计分析绘图软件 
SewerCAD污水管网系统软件
XP-SWMM 水文仿真系统
Magsoft Flux-3D, 2D 电磁及 EMI 分析软件 
Origin 工程及科学用绘图软件 
PSCAD 电力系统模拟分析 
SmartDraw 商业绘图管理软件 
SKM 电力系统分析设计软件 
Tecplot 三维流场视觉化绘图软件 
AVL cruise 汽车整车仿真软件
FinTools 金融资产定价分析与预测软件 
Frontier 数据包络法分析软件 
Midas/FX+ 有限元分析软件
RMXPRT旋转电机设计大师
GAMS 作业研究软件 
Lindo/Lingo 作业研究软件 
Mathematica 高阶数学及符号运算软件 
MathType 数学符号编辑软件 
Statgraphics 数据分析结果解读软件 
@Risk 风险评估管理软件 
ease 声学仿真软件
ChemOffice 分子结构绘图软件 
Gaussian 计算化学软件 
HyperChem 化学计算及分子结构软件 
Spartan 量子化学绘图软件 
Diffpack 偏微分方程式软件 
FilterShop 类比/数据滤波器设计软件 
PVTsim多用途PVT模拟软件(勘探开发) 
Materials Explorer Professional4.0
Materials Explorer Ultra4.0
Grapher, Surfer 2D/3D 曲面及地图绘制软件 
铸造模拟软件MAGMAsoft
ISIGHT 软件机器人
材料性能模拟软件JMatPro
Matlad/Simulink仿真软件
注塑流动分析软件MoldFlow、Moldex及C-Mold. 
塑胶镜片设计及分析软件ZEMAX
塑胶挤压及分析软件Nekton
塑胶注塑螺丝设计及分析软件WINSSD 
流固热固耦合分析软件 MPCCI
铁路轮轨动力学仿真计算软件NUCARS
油气管道的设计和规划软件 Energy Solutions Pipeline Studio


︻◣:soft215@163.com (感谢各位客户e_mail咨询,我们将尽全力提供更好的服务)
︻◣:517655728,(QQ全天候咨询)

5 楼

好贴!解析指纹类的软件用的也应该使这个技术了

6 楼

正好要用到,非常感谢

我来回复

您尚未登录,请登录后再回复。点此登录或注册