png文件格式详解【转】

2023-11-18

5.2.2  PNG图像文件存储结构(1)

PNG文件存储结构的格式可以在http://www.w3.org/TR/REC-png.htm上找到定义。

BMP文件总体上由两部分组成,分别是PNG文件标志和数据块(chunks),如表5-8所示。其中数据块分为两类:关键数据块(critical chunk)和辅助数据块(ancillary chunks)。

表5-8 PNG文件的组成结构

PNG文件标志

数据块(chunks)

1.PNG文件标志

PNG文件标志由8字节数据组成:89 50 4E 47 0D 0A 1A 0Ah,其中50 4E 47对应的ASCII值是"PNG"。

2.数据块(chunks)

紧跟在PNG文件标志后面的数据是数据块(chunks),数据块(chunks)分为两类:关键数据块(critical chunks)和辅助数据块(ancillary chunks)。

关键数据块(critical chunk)在PNG文件中是必须有的,而辅助数据块(ancillary chunks)是可选的。

关键数据块(critical chunks)由4部分组成:文件头数据块(IHDR)、调色板数据块(PLTE)、图像数据块(IDAT)和图像结束数据(IEND),其中调色板数据块(PLTE)根据图像的色深可选。

辅助数据块(ancillary chunks)一共有14个,这些辅助数据块包含了很多信息,辅助数据块不是必须包含的。

PNG文件的关键数据块和辅助数据块的组织顺序如表5-9和表5-10所示。

表5-9 PNG文件的关键数据块(critical chunks)组织顺序

数据块名称

允许多

个数据块

位    置

文件头数据块(IHDR)

不允许

第一个数据块

调色板数据块(PLTE)

不允许

第二个数据块,可选

图像数据块(IDAT)

允许

如果有调色板数据块(PLTE),则是第三个数据块,如果没有调色板数据块(PLTE),则时第二个数据块。如果有多个图像数据块,则必须按图像数据连续存储

图像结束数据(IEND)

不允许

最后一个数据块

表5-10 PNG文件的辅助数据块(ancillary chunks)组织顺序

数据块名称

允许多个

数据块

位    置

基色和白色点数据块(cHRM

不允许

在PLTE和IDAT之前

图像γ数据块(gAMA

不允许

在PLTE和IDAT之前

ICCP(iCCP)

允许

在PLTE之后IDAT之前如果有iCCP,则无sRGB

续表

数据块名称

允许多个

数据块

位    置

样本有效位数据块(sBIT

不允许

在PLTE和IDAT之前

标准RPG颜色(sRGB

不允许

在PLTE之后IDAT之前如

果有sRGB,则无iCCP

背景颜色数据块(bKGD

不允许

在PLTE之后IDAT之前

图像直方图数据块(hIST

不允许

在PLTE之后IDAT之前

图像透明数据块(tRNS

不允许

在PLTE之后IDAT之前

物理像素尺寸数据块(pHYs

不允许

在IDAT之前

建议调色板(sPLT

允许

在IDAT之前

图像最后修改时间数据块(tIME

不允许

无限制

国际文本数据(iTXt

允许

无限制

文本信息数据块(tEXt

允许

无限制

压缩文本数据块(zTXt

允许

无限制

 

5.2.2  PNG图像文件存储结构(2)

用图像可以清晰显示表5-9和表5-10之间的关系,如图5-13和图5-14所示。

(点击查看大图)图5-13  包含调色板数据块(PLTE)的PNG图像文件格式
(点击查看大图)图5-14  不包含调色板数据块(PLTE)的PNG图像文件格式

图中上标的含义如表5-11所示。

表5-11 上标的含义

符    号

含    义

1

只有1个

+

1个或多个

0个或1个

*

0个或多个

|

2选1

PNG图像文件中每一块数据块的格式都是相同的,分别由4个部分组成,格式如表5-12所示。

表5-12 PNG文件的数据块格式

字  段  名

大小(单

位:字节)

描    述

Length(长度)

4

指定数据块中的数据长度

Chunk Type Code(数据块类型码)

4

数据块类型,例如

IHDR、PLTE、IDAT等

Chunk Data(数据块数据)

Length

存储数据

CRC(循环冗余检测)

4

循环冗余码

CRC循环冗余码生成的计算方式是通过对Chunk Type Code和Chunk Data中的数据进行计算得到的,计算方式如下:

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

 

 5.2.2  PNG图像文件存储结构(3)

下面将讲解在PNG文件中的4个关键数据块(critical chunk)的含义。

① 文件头数据块(IHDR)

文件头数据块(IHDR)它包含有PNG文件中存储的图像数据的基本信息,如图像的宽高、色深、颜色类型、压缩方式等。一个PNG文件只能有一个文件头数据块,表5-13列出了文件头数据块(IHDR)中各字段的含义。

表5-13 文件头数据块(IHDR) 中各字段的含义

字段名

大小(单

位:字节)

描    述

Width

4

图像宽度,以像素为单位

Height

4

图像高度,以像素为单位

Bit depth

1

图像深度:

索引彩色图像:1,2,4或8

灰度图像:1,2,4,8或16

真彩色图像:8或16

ColorType

1

颜色类型:

0:灰度图像,1,2,4,8或16

2:真彩色图像,8或16

3:索引彩色图像,1,2,4或8

4:带α通道数据的灰度图像,8或16

6:带α通道数据的真彩色图像,8或16

Compression

 method

1

压缩方法(LZ77变种算法)

Filter method

1

滤波器方法

Interlace

 method

1

隔行扫描方法:

0:非隔行扫描

1: Adam7(由Adam M.

 Costello开发的7遍隔行扫描方法)

文件头数据块(IHDR)结构可以使用如下代码定义:

typedef struct {
DWORD btChunkLen;
CHAR btChunkType[4];
} PNG_CHUNK_HEADER;
typedef enum  pngColorSpaceType {
GrayScale = 0,
TrueColor = 2,
Indexed = 3,
AlphaGrayScale = 4,
AlphaTrueColor = 6
} PNG_COLOR_SPACE_TYPE;
// Compression Methods
typedef enum   pngCompressionMethod {
Deflate = 0
} PNG_COMPR_METHOD;
// Filter Methods
typedef enum  pngFilterMethod {
AdaptiveFiltering = 0
} PNG_FILTER_METHOD;
// Interlace Methods
typedef enum  pngInterlaceMethod {
NoInterlace = 0,
Adam7Interlace = 1
} PNG_INTERLACE_METHOD;
// IHDR data
typedef struct {
UINT                 width;
UINT                 height;
BYTE                 bit_depth;
PNG_COLOR_SPACE_TYPE color_type;
PNG_COMPR_METHOD     compr_method;
PNG_FILTER_METHOD    filter_method;
PNG_INTERLACE_METHOD interlace_method;
} IHDR_CHUNK_DATA;

② 调色板数据块(PLTE)

PNG的调色板数据块(PLTE)和之前介绍BMP图像格式中的调色板类似,都是提供给8位色深以下的图像使用。PNG的调色板由3个字节组成,每个字节分别表示红、绿、蓝三色的颜色值。

对于PNG图像文件来说,大于8位色深的图像,如真彩色图像也可以使用调色板,目的是便于非真彩色显示程序用它来量化图像数据,从而显示该图像。

一个PNG文件只能有一个调色板数据块,调色板数据块从下标0开始,表5-14列出了调色板数据块(PLTE)中各字段的含义。

表5-14 调色板数据块(PLTE) 中各字段的含义

字段名

大小(单

位:字节)

描    述

btRed

1

红色颜色值

btGreen

1

绿色颜色值

btBlue

1

蓝色颜色值

调色板数据块(PLTE)结构可以使用如下代码定义:

typedef struct {
BYTE btRed ;
BYTE btGreen;
BYTE btBlue;
} PNG_PALETTE_PIXEL;

 

5.2.2  PNG图像文件存储结构(4)

③ 图像数据块(IDAT)

PNG的图像数据块(IDAT)存储图像的实际数据,相当于BMP图像的图像数据,由于PNG可包含多幅图像,所以PNG的图像数据块可能是由一幅图像的数据组成,也可能是由多幅图像的数据组成。

图像数据块中的图像数据可能是经过变种的LZ77压缩编码DEFLATE压缩的,关于DEFLATE详细介绍可以参考《DEFLATE Compressed Data Format Specification version 1.3》,网址:http://www.ietf.org/rfc/rfc1951.txt

图像数据块(IDAT)结构可以使用如下代码定义:

PNG_CHUNK_HEADER chunkHdr;
BYTE idatChunkData[chunkHdr.btChunkLen];
DWORD idatCrc <format=hex>;

④ 图像结束数据(IEND)

PNG的图像结束数据(IEND)用来标记PNG文件结束,并且必须要放在文件的尾部。一般情况下,所有PNG图像结束数据(IEND)的十六进制数值都是一样的,具体的数值如下:

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

PNG的辅助数据块(ancillary chunks)一共有14个,可以分为5类,如表5-10所示,由于篇幅关系不能将全部辅助数据块(ancillary chunks)的详细结构进行说明,如果读者有兴趣请参考http://www.w3.org/TR/REC-png.html

 

 

5.2.3  分析PNG图像文件结构(1)

结合上面对PNG文件的分析,下面分别对256色和16位色的PNG图像进行十六进制分析,通过分析PNG文件让读者更深入了解PNG文件格式。

如图5-15和图5-16所示,分别为256色PNG图像pic1.png和16位色PNG图像pic2.png。其中pic1.png图像的分辨率为200×150,文件大小为19 534 字节。pic2.png图像的分辨率为200×150,文件大小为104 744字节,带透明通道。

图5-15  pic1.png图像
图5-16  pic2.png图像

现在来分析pic1.png的图像文件,在Winhex中打开pic1.png,如图5-17所示。

(点击查看大图)图5-17  在Winhex中打开pic1.png文件

首先分析PNG的文件标志。根据PNG文件的定义,从文件头开始前8字节数据是PNG文件的标志,如图5-18所示。

(点击查看大图)图5-18  PNG文件的文件标志

接下来应该就是PNG文件的数据块结构了,按照前面对PNG文件结构的分析,第一个数据块应该是文件头数据块(IHDR)数据块,文件头数据块(IHDR)定义了PNG文件的宽高、色深、压缩方法等参数,如图5-19所示。

(点击查看大图)图5-19  文件头数据块(IHDR)结构

 

5.2.3  分析PNG图像文件结构(2)

表5-15归纳了pic1.png图像文件中文件头数据块(IHDR)中各字段的含义。由于PNG文件使用Big-Endian顺序存储数据,所以不需要反转字节数据理解。

表5-15 pic1.png图像文件中文件头数据块(IHDR)的各字段含义

十六进制值

描    述

00 00 00 0D

文件头的数据长度,00 00 00 0D =13

49 48 44 52

数据块类型标志,49 48 44 52的ASCII值等于IHDR

00 00 00 C8

图像的宽度,00 00 00 C8 = 200

00 00 00 96

图像的高度,00 00 00 96 = 150

08

色深,表示2的8次幂等于256色

03

03表示索引图像

00

00表示使用Deflate压缩编码压缩图像数据

00

00表示为将来使用更好的压缩方法预留

00

00表示非隔行扫描

AC 02 37 2B

AC 02 37 2B表示CRC

从表5-14看到pic1.png文件的文件头数据块(IHDR)结构中的CRC字段的值为AC 02 37 2B,这个CRC值是按照从数据块类型标志字段到CRC字段前一字节的数据计算而来的,即使用数据49 48 44 52 00 00 00 C8 00 00 00 96 08 03 00 00 00计算,CRC的计算代码如下:

   /*8位消息的CRC表格*/
unsigned long crc_table[256];

/*Flag:CRC表格计算完了吗?初始化 False*/
int crc_table_computed = 0;

/*写一个CRC表格*/
void make_crc_table(void)
{
unsigned long c;
int n, k;

for (n = 0; n < 256; n++) {
c = (unsigned long) n;
for (k = 0; k < 8; k++) {
if (c & 1)
c = 0xedb88320L ^ (c >> 1);
else
c = c >> 1;
}
crc_table[n] = c;
}
crc_table_computed = 1;
}
/*使用bu[0..len-1]更新CRC表格*/
unsigned long update_crc(unsigned long crc, unsigned char *buf,
int len)
{
unsigned long c = crc;
int n;

if (!crc_table_computed)
make_crc_table();
for (n = 0; n < len; n++) {
c = crc_table[(c ^ buf[n]) & 0xff] ^ (c >> 8);
}
return c;
}

/* 返回 CRC表格buf[0..len-1]. */
unsigned long crc(unsigned char *buf, int len)
{
return update_crc(0xffffffffL, buf, len) ^ 0xffffffffL;
}
main()
{
/*计算CRC需要的初始化数据,不同的数据块有不同的初始化数据*/
unsigned char buf[17] = {
0x49,0x48,0x44,0x52,0x00,0x00,0x00,0xC8,0x00,
0x00,0x00,0x96,0x08,0x03,0x00,0x00, 
0x00 
};
unsigned long value=0;
value= crc(buf,17);
}

继续分析下面的数据块,PNG图像文件的数据块类型由数据块类型标志决定,按照PNG图像文件中数据块的数据结构分析,接下来的数据块是物理像素尺寸数据块(pHYs),物理像素尺寸数据块(pHYs)指定像素大小或图像的宽和高的比例。

表5-16所示为物理像素尺寸数据块(pHYs)中各字段的含义。

表5-16 物理像素尺寸数据块(pHYs) 中各字段的含义

 

字  段  名

大小(单

位:字节)

描    述

physPixelPerUnitX

4

每单位多少像素,x

physPixelPerUnitY

4

每单位多少像素,y

UnkownUnit ,Meter

1

枚举类型,UnkownUnit=0,表示只定义了像素显示的比例,未定义实际像素大小。

枚举类型,Meter=1,表示定义单位为米

物理像素尺寸数据块(pHYs)的结构可以用以下代码定义:

PNG_CHUNK_HEADER chunkHdr ;
uint physPixelPerUnitX;
uint physPixelPerUnitY;
enum {
UnkownUnit = 0,
Meter = 1
} pHYs;
DWORD pHYsCrc;

图5-20所示为pic1.png中的物理像素尺寸数据块(pHYs)的结构。

(点击查看大图)图5-20  pic1.png中的物理像素尺寸数据块(pHYs)的结构

 

5.2.3  分析PNG图像文件结构(3)

表5-17所示为pic1.png图像文件中物理像素尺寸数据块(pHYs)中各字段的含义。

表5-17 pic1.png图像文件中物理像素尺寸数据块(pHYs)中各字段的含义

十六进制值

描    述

00 00 00 09

物理像素尺寸数据块的长度,00 00 00 09 =9

70 48 59 73

数据块类型标志,70 48 59 73的ASCII值等于pHYs

00 00 0B 13

x轴上每米像素的数量,00 00 0B 13 = 2835,即每米2835个像素

00 00 0B 13

y轴上每米像素的数量,00 00 0B 13 = 2835,即每米2835个像素

01

Meter=1,将单位定义为米

00 9A 9C 18

CRC值

继续分析下面的数据,按照前面的分析方法,分析出接下来的数据块是iCCP,iCCP数据块是PNG解码时进行特殊的颜色处理信息。

iCCP数据块的结构可以用以下代码定义:

PNG_CHUNK_HEADER chunkHdr
typedef struct {
string profile_name;
unsigned byte red;
} PNG_ICCP_CHUNK_DATA;
DWORD ICCPCrc; 

图5-21所示为pic1.png中的iCCP的数据结构。

(点击查看大图)图5-21  pic1.png图像文件中iCCP数据块结构
(点击查看大图)图5-21  pic1.png图像文件中iCCP数据块结构


表5-18所示为pic1.png图像文件中的iCCP数据块各字段的含义。

表5-18 pic1.png图像文件中的iCCP数据块各字段的含义

 

十六进制值

描    述

00 00 0A 4D

ICCP数据块的长度,00 00 0A 4D = 2637

69 43 43 50

数据块类型标志,69 43 43 50的ASCII值等于iCCP

50 68 6F 74 6F 73 68 6F 70 20 49 43 43 20 70 72 6F 66 69 6C 65 00

配置文件名,长度1~79字节,以0作为终止符的字符串。

50 68 6F 74 6F 73 68 6F 70 20 49 43 43 20 70 72 6F 66 69 6C 65 00 的ASCII值等于Photoshop ICC profile

00

压缩方法,0表示使用deflate压缩

78 DA 9D 53~F7 84 F3 FB

压缩后的配置文件,解码时使用

继续分析下面的数据,按照前面的分析方法,分析出接下来的数据块是gAMA,gAMA数据块是PNG解码时进行gamma校正的信息。

gAMA数据块的结构可以用以下代码定义:

PNG_CHUNK_HEADER chunkHdr;
BYTE gamaChunkData[chunkHdr.btChunkLen];
DWORD gamaCrc;

图5-22所示为pic1.png中的gAMA的数据结构:

(点击查看大图)图5-22  pic1.png图像文件中gAMA数据块结构

 

5.2.3  分析PNG图像文件结构(4)

表5-19所示为pic1.png图像文件中的gAMA数据块各字段的含义。

表5-19 pic1.png图像文件中的gAMA数据块各字段的含义

十六进制值

描    述

00 00 00 04

gAMA数据块的长度,00 00 00 04 = 4

67 41 4D 41

数据块类型标志,67 41 4D 41的ASCII值等于gAMA

00 00 B1 8E

gamma校正信息

7C F8 51 93

CRC值

继续分析下面的数据,按照前面的分析方法,分析出接下来的数据块是cHRM,cHRM是在设备不能够显示正确的颜色时,使图像尽可能校正颜色的信息,也叫做设备无关的颜色信息。

cHRM数据块的结构可以用以下代码定义:

typedef struct {
uint x; 
uint y;
} PNG_POINT;
typedef struct {
PNG_POINT white;
PNG_POINT red;
PNG_POINT green;
PNG_POINT blue;
} PNG_CHRM_CHUNK_DATA;
PNG_CHUNK_HEADER chunkHdr;
PNG_CHRM_CHUNK_DATA chrmChunkData;
DWORD chrmCrc;

图5-23所示为pic1.png中的cHRM的数据结构。

(点击查看大图)图5-23  pic1.png图像文件中cHRM数据块结构

表5-20所示为pic1.png图像文件中的cHRM数据块各字段的含义。

表5-20 pic1.png图像文件中的cHRM数据块各字段的含义

十六进制值

描    述

00 00 00 20

cHRM数据块的长度,00 00 00 20 = 32

63 48 52 4D

数据块类型标志,63 48 52 4D的ASCII值等于cHRM

00 00 7A 25

白色点的x轴坐标,00 00 7A 25 = 31269

续表

十六进制值

描    述

00 00 80 83

白色点的y轴坐标,00 00 80 83 = 32899

00 00 F9 FF

x坐标,00 00 F9 FF = 63999

00 00 80 E9

y坐标,00 00 80 E9 = 33001

00 00 75 30

绿x坐标,00 00 75 30 = 30000

00 00 EA 60

绿y坐标,00 00 EA 60 = 60000

00 00 3A 98

x坐标,00 00 3A 98 = 15000

00 00 17 6F

x坐标,00 00 17 6F  = 5999

92 5F C5 46

CRC值

继续分析下面的数据,按照前面的分析方法,分析出接下来的数据块是调色板数据块(PLTE),因为pic1.png是256色图像,所以应该有256个调色板项,每个调色板项占3字节。

调色板数据块(PLTE)的结构可以用以下代码定义:

typedef struct {
BYTE btRed; 
BYTE btGreen;
BYTE btBlue;
} PNG_PALETTE_PIXEL;
PNG_CHUNK_HEADER chunkHdr;
PNG_PALETTE_PIXEL plteChunkData[chunkHdr.btChunkLen/3];
DWORD plteCrc;

 

5.2.3  分析PNG图像文件结构(5)

图5-24所示为pic1.png中的调色板数据块(PLTE)的数据结构。

(点击查看大图)图5-24  pic1.png图像文件中调色板数据块(PLTE)结构
(点击查看大图)图5-24  pic1.png图像文件中调色板数据块(PLTE)结构

表5-21 所示为pic1.png图像文件中的调色板数据块(PLTE)各字段的含义。

表5-21 pic1.png图像文件中调色板数据块(PLTE)各字段的含义

十六进制值

描    述

00 00 03 00

PLTE数据块的长度,00 00 03 00 = 768

50 4C 54 45

数据块类型标志,50 4C 54 45的ASCII值等于PLTE

00 00 00

调色板第1个索引

FF FF FF

调色板第2个索引

EA FF FF

调色板第3个索引

…………

调色板第…个索引

E4 DC DC

调色板第255个索引

FF FF FF

调色板第256个索引

7D 2C 3D AD

CRC值

继续分析下面的数据,按照前面的分析方法,分析出接下来的数据块是图像透明数据块(tRNS),对于256色图像来说,图像透明数据块(tRNS)一共有256项,每项对应调色板数据块中的一项,00代表透明,FF代表不透明。

图像透明数据块(tRNS)的结构可以用以下代码定义:

PNG_CHUNK_HEADER chunkHdr;
BYTE trnsChunkData[chunkHdr.btChunkLen]
DWORD trnsCrc;

图5-25所示为pic1.png中的图像透明数据块(tRNS)的数据结构。

(点击查看大图)图5-25  pic1.png图像文件中图像透明数据块(tRNS)的结构

表5-22所示为pic1.png图像文件中的图像透明数据块(tRNS)各字段的含义。

表5-22 pic1.png图像文件中图像透明数据块(tRNS)各字段的含义

十六进制值

描    述

00 00 01 00

tRNS数据块的长度,00 00 01 00 = 256

74 52 4E 53

数据块类型标志,74 52 4E 53的ASCII值等于tRNS

FF~00

图像透明数据块,一共256个,每个对应调色
板中的一项,00代表透明,FF代表不透明

53 F7 07 25

CRC值

继续分析下面的数据,按照前面的分析方法,分析出接下来的数据块是图像数据块(IDAT)。对于256色图像来说,图像数据块(IDAT)存放的是指向调色板的索引序号,对于16位色以上图像,图像数据块(IDAT)存放的是实际像素颜色,按0xRRGGBB排列。需要注意的是,图像数据块(IDAT)中的数据是经过变种的LZ77压缩过的。

图像数据块(IDAT)的结构可以用以下代码定义:

PNG_CHUNK_HEADER chunkHdr;
BYTE idatChunkData[chunkHdr.btChunkLen];
DWORD idatCrc;

 

5.2.3  分析PNG图像文件结构(6)

图5-26所示为pic1.png中的图像数据块(IDAT)的数据结构。

(点击查看大图)图5-26  pic1.png中的图像数据块(IDAT)的数据结构
(点击查看大图)图5-26  pic1.png中的图像数据块(IDAT)的数据结构

表5-23所示为pic1.png图像文件中的图像数据块(IDAT)各字段的含义。

表5-23 pic1.png图像文件中图像数据块(IDAT)各字段的含义

十六进制值

描    述

00 00 3D 53

IDAT数据块的长度,00 00 3D 53 = 15699

49 44 41 54

数据块类型标志,49 44 41 54的ASCII值等于IDAT

78~67

图像数据块,一共15699字节,使用变种的LZ77压缩过

0E EE 51 34

CRC值

继续分析下面的数据,按照前面的分析方法,分析出接下来的数据块是图像结束数据(IEND),一般情况下所有PNG图像的图像结束数据(IEND)是一样的,除非自行修改。

图像结束数据(IEND)的结构可以用以下代码定义:

PNG_CHUNK_HEADER chunkHdr;
DWORD idatCrc;

图5-27所示为pic1.png中的图像结束数据(IEND)的数据结构。

(点击查看大图)图5-27  pic1.png中的图像结束数据(IEND)的数据结构

表5-24所示为pic1.png图像文件中的图像结束数据(IEND)各字段的含义。

表5-24 pic1.png图像文件中图像结束数据(IEND)各字段的含义

十六进制值

描    述

00 00 00 00

IEND数据块的长度,00 00 00 00 = 0

49 45 4E 44

数据块类型标志,49 45 4E 44的ASCII值等于IEND

AE 42 60 82

CRC值

pic1.png文件格式已经分析完毕,pic2.png的文件格式可以参考上面pic1.png的分析,表5-25显示了pic1.png和pic2.png的文件结构区别。

表5-25 pic1.png和pic2.png的文件结构区别

pic1.png文件结构

pic2.png文件结构

IHDR

IHDR

pHYs

pHYs

iCCP

iCCP

gAMA

gAMA

cHRM

cHRM

PLTE

×

tRNS

×

IDAT

IDAT

IEND

IEND

从表5-24可以看出pic2.png没有PLTE和tRNS数据块,因为pic2.png是16位色图像不需要使用调色板。

PNG图像文件存储的数据块比较多,一般情况每个PNG图像文件的iCCP、gAMA和cHRM数据块中的数据是一样的,只有IHDR和pHYs两个数据块中某些字段数据不同,如图5-28所示。

(点击查看大图)图5-28  两张不同的PNG格式图像的区别
(点击查看大图)图5-28  两张不同的PNG格式图像的区别

所以很多时候游戏编程人员为了节省游戏资源占用的硬盘空间,去掉了PNG图像文件的某些数据块。如果游戏的资源打包文件包含了PNG图像文件,但去掉了PNG某些数据块,这样对分析游戏资源包文件格式带来了一定的困难,但幸好PNG图像文件的某些数据块还是要保留的,例如图像数据块(IDAT),通过识别某些数据块的标识字符串还是比较容易识别出PNG格式的。

--------------------- 本文来自 joqian 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/joqian/article/details/8290389?utm_source=copy

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

png文件格式详解【转】 的相关文章

  • 将 SVG 转换为 PNG 并调整其大小

    我正在尝试将 SVG 转换为 PNG 或任何光栅格式 并同时调整大小 我以为我会使用 ImageMagick 来完成此任务 但它似乎在调整大小之前转换为光栅 这会导致图像质量较差 有没有办法让 ImageMagick 在转换为光栅之前调整
  • 保存为 .ps/.eps 时 Matplotlib 绘图失去透明度

    如果我尝试使用 ps eps 扩展名保存一些带有透明椭球体的绘图 我会遇到问题 Here s the plot saved as a png If I choose to save it as a ps eps here is what i
  • 在 C# 中将所有内容转换为 JPG

    我有一个如下所示的函数 Convert To JPG public string AlltoJPG FileInfo foo Get file extension string fileExtension foo Extension Get
  • 16位灰度PNG

    我正在尝试编写 使用 libpng 一个 16 位灰度图像 其中每个点颜色等于其坐标之和 以下代码应生成 16 位 PNG 但会生成 8 位 例如this http dl dropbox com u 15187698 test png Wh
  • 理论上来说:iPhone OS 中的 alpha 分量如何预乘到 PNG 的其他分量中,以及如何正确取消预乘?

    事实上 我认为有一个简单的方法可以实现这一目标 我需要的是纯粹的阿尔法值信息 为了进行测试 我有一个 50 x 55 像素的 PNG 其中每条边上都有一个 5x5 像素的矩形是完全透明的 在这些区域中 alpha 必须为 0 在其他地方 它
  • CSS - 使用滤镜为黑白 PNG 图像添加颜色

    CSS 中是否可以使用滤镜为黑白图像添加颜色 我说的是像 Photoshop 中那样使用过滤器 更好的例子是 Microsoft PowerPoint 中的过滤器 我想做的是 我有一个黑色图标的图像文件 我想为其添加一个过滤器 以便图像中的
  • 使用 PHP 实现 PNG 透明度

    嘿 当我从 png 创建缩略图时 试图保持 png 的透明度时遇到了一些麻烦 有人有这方面的经验吗 任何帮助都会很棒 这就是我目前正在做的事情 fileName js ajaxupload tees fileName list width
  • 从 Shiny (R) 下载 png

    我对 Shiny 和 R 还很陌生 并且正在努力将我在 Shiny 中制作的情节导出到 png 文件 我查看了这两个线程 但无法弄清楚 保存在闪亮的应用程序中制作的绘图 https stackoverflow com questions 1
  • 如何在 iOS 中将自定义元数据写入 PNG 图像

    我的应用程序应该能够将自定义元数据条目写入 PNG 图像 以便导出到 UIPasteboard 通过将有关该主题的各种帖子拼凑在一起 我已经能够提出下面给出的课程作为来源 使用按钮触发 copyPressed 方法 我可以使用 JPG 图像
  • 对于 iOS 上的所有图像文件,PNG 是否优于 JPEG?

    Xcode 优化了 png 图像 以便它们加载得更快 但是这是否也推荐用于其他不用于按钮和 UI 的图像资源 例如照片 或者 UI 图像为 png 且 照片 为 JPEG 是一个标准吗 这里的最佳实践是什么 最佳实践是在应用程序中使用图像时
  • PNG、GIF、JPEG、SVG 有哪些不同的用例? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 在构建网站或界面等时何时应使用某些图像文件类型 他们的优点和缺点是什么 我知道PNG和GIF是无损的 而JPEG是有损的 但 PNG
  • 从 Shiny (R) pt 下载 png。 2

    这与我之前问过的一个问题有关 从 Shiny R 下载 png https stackoverflow com questions 26764481 downloading png from shiny r 我现在已经创建了多个闪亮的图并下
  • iOS PNG图像旋转90度

    在我正在编写的 iOS 应用程序中 我处理 PNG 因为我处理 Alpha 通道 由于某种原因 我可以将 PNG 加载到我的imageView很好 但是当需要将图像从我的应用程序复制到粘贴板上或将图像保存到我的相机胶卷时 图像会旋转 90
  • 将一堆扩展名为“.jpg”的 PNG 图像重命名为“.png”

    所以我有一个包含数千个图像文件的文件夹 所有这些文件都保存为 jpg 问题是其中一些文件实际上是 PNG 图像文件 因此它们无法在很多程序中打开 除非我手动将其扩展名更改为 png 例如 Ubuntu 图像查看器会抛出此错误 解释 JPEG
  • JavaScript 生成 dataURL 格式的透明 1X1 像素

    我想知道一种在 JavaScript 中生成单个像素并将其转换为 base64 的方法 理想的函数是 function createPixel hexColor opacity Calculate return base64DataURL
  • 一次另存为多个文件(GIMP)[关闭]

    Closed 这个问题是与编程或软件开发无关 help closed questions 目前不接受答案 我有一系列 xcf我想另存为的图像 png 我可以打开每个文件并另存为 png但由于图像较多 因此需要相当长的时间 有没有一种方法可以
  • 将 PNG 从预乘 alpha 转换为传统的 alpha 透明度?

    我在处理一些具有预乘 Alpha 的 PNG 格式的源图像时遇到了很大的困难 因为大多数工具根本无法正确支持它 有没有什么可以将 最佳猜测 转换为更传统的PNG 如果 预乘 alpha 指的是 iOS 的 PNG 衍生品 那么您可以将它们转
  • 使用pylab同时显示两个png图像

    我想打开两个 png 图像文件并将它们并排显示以进行视觉比较 我有以下代码用于打开一个 png 文件 我从 stackoverflow com 上的 unutbu 获得 import numpy as np import pylab imp
  • 在VS2008中使用wpf透明png

    我想在 WPF VS2008 中制作一个半透明的 UI 因此我将表单设为透明 并想在其顶部显示一个半透明 png 其中包括 孔 如何显示半透明png 半透明 意味着它有可以看到的孔 另外 我如何在 C 中完成此操作 而不使用 WPF Tha
  • openGL转png

    我正在尝试将包含大量纹理 没有移动 的 openGL 编辑 我画的卡片 thx unwind 转换为一个 PNG 文件 我可以在框架的另一部分中使用该文件我正在与 有 C 库可以做到这一点吗 thanks 如果您的意思只是 获取由 Open

随机推荐

  • POI操作excel基本使用

    不用多说 下面的一个类中就是一些POI操作Excel xls 的常见操作 但是真正要生成一些如报表等复杂格式Excel的时候 通常的做法都是事先把格式一切的东西都手动制作好 数据模板 然后在Java应用中适当的时机把这个文件读进来 添加相应
  • 【蓝桥杯试题】试题 算法训练 印章

    试题 算法训练 印章 资源限制 时间限制 1 0s 内存限制 256 0MB 问题描述 共有n种图案的印章 每种图案的出现概率相同 小A买了m张印章 求小A集齐n种印章的概率 输入格式 一行两个正整数n和m 输出格式 一个实数P表示答案 保
  • 正则实现去除字符串前后空格

    前言 正则去掉字符串前后空格 1 去除左空格 str1是处理后的 let str1 str replace s g 2 去除右空格 str2是处理后的 let str2 str replace s g 3 去除左右空格 let str3 s
  • qt 多边形填充 生成语义分割的mask 灰度图

    qt多边形的绘制 填充与显示 直接在QWidget界面显示 重写paintEvent即可 QtTest QtTest QWidget parent QMainWindow parent ui setupUi this void QtTest
  • linux c 语言小结

    linux c 语言小结 gdb 使用 gdb是调试linux c语言代码的 所以要调试linux c语言 先要 gcc g 文件名 才能开始调试 gdb 命令 首先在命令行中输入 gdb 调试的基本代码 list 展示 s 进入函数内部
  • 如何理解原码,反码,补码转换

    首先 无论原码还是反码还是补码都是二进制形式 有效位数是7位 最后 最左边 一位是符号位 用以区别正负 数据在内存中是以 补码 的形式存放 一 区别 原码 最高位 0 是正数 最高位 1 是负数 反码 正数 与原码一致 负数 最高位不变 其
  • 为什么我的AJAX请求处理成功了,还报404错误

    为什么我的AJAX请求处理成功了 还报404错误 忘了添加 ResponseBody注解 参考博客 https blog csdn net jiaotuwoaini article details 53445182
  • 标注数字对应的文本_循环嵌套_全局暂元

    标注数字对应的文本 循环嵌套 全局暂元 1 清洗数据 cd path EPS data use temp ybmy nodest dta clear gen hy3 real substr string hy4 1 3 gen hy2 re
  • 安全客&FREEBUF 文章阅读量似乎有点问题

    安全客 FREEBUF 文章阅读量似乎有点问题 随手写个脚本测试一下 其中freebuf那篇文章是很老的文章了 居然阅读量还是嗖嗖的涨 下次是不是可以写个折线图分析一下 看看每次加的是不是有规律的 scripts cat freebufcu
  • OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000b4680000, 297795584, 0)

    在测试环境中 出现如下报错 经排查发现是物理机内存不足 此时对应服务进程已不在 OpenJDK 64 Bit Server VM warning INFO os commit memory 0x00000000b4680000 297795
  • TIM的一些配置参数

    1 使能TIM时钟 RCC APB1PeriphClockCmd RCC APB1Periph TIM ENABLE 2 基础设置 TIM TimeBaseStructure TIM Period 计数值 TIM TimeBaseStruc
  • osg fbo(四),将颜色缓冲区图片中的牛通过shader变绿

    osg fbo 三 中 把整个屏幕变绿了 因为是把shader添加到了颜色缓冲区图片上了 如果只想把牛变绿 就需要把shader添加到原始场景根中 即 osg ref ptr
  • Linux笔记:终端复用与管理工具screen和tmux

    文章目录 目的 screen 快速入门 更多介绍 tmux 快速入门 窗口与窗格 更多介绍 总结 目的 通过终端使用Linux时比较纠结的是一个终端通常同一时间只能做一件事 虽然可以将任务放入后台 但是对于有输出或交互的任务放入后台并不是一
  • Linux 等待队列

    1 Linux内核中等待队列简介 Linux 内核等待队列可以用于许多用途 如中断 进程同步 以及定时 等待队列实现了在事件上的条件等待 希望等待特定事件的进程把自己放进合适的队列 并且放弃控制权限 因此等待队列表示一组睡眠的进程 当某一事
  • 基于Sql-Labs靶场的SQL注入-11~16关

    目录 Less 11 基于POST表单提交方式的字符型注入 爆破数据库名 爆破表名 爆破列名 爆破字段值 Less 12 基于POST表单提交方式的字符型注入 Less 13 基于POST表单提交方式的报错注入 爆破数据库名 爆破表名 爆破
  • HDLBits — Verilog Practice(每日一题)

    HDLBits Verilog Practice 每日一题 一 Getting Started 1 Getting Started 一 Getting Started 1 Getting Started 问题描述 Build a circu
  • C/C++面试笔试知识点总结

    C C 面试笔试知识点总结 1 const关键字的作用 变量 参数 返回值 2 什么是死锁 3 造成死锁的4个必要条件 4 如何避免死锁 5 static关键字作用 6 c c 中内存可以划分为几个部分 7 new 和 malloc的区别
  • DC-2靶机渗透测试

    1 信息收集 使用arp scan l扫描 扫描靶机开放端口 直接访问192 168 188 165发现无法访问被重定向到了 http dc 2 修改hosts文件 hosts文件是linux系统中负责ip地址与域名快速解析的文件 Linu
  • 关于实体类中多层嵌套集合,用mybatis的collection标签可以快速实现

    一 首先分析需求在有三个实体类的情况下 好比user类 Student YearClass类 结构如下 最外层类 public class user private String name private String age privat
  • png文件格式详解【转】

    5 2 2 PNG图像文件存储结构 1 PNG文件存储结构的格式可以在http www w3 org TR REC png htm上找到定义 BMP文件总体上由两部分组成 分别是PNG文件标志和数据块 chunks 如表5 8所示 其中数据