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所示。

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

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

    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.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-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-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格式

PNG图像文件存储结构相关推荐

  1. PyTorch 笔记(11)— Tensor内部存储结构(头信息区 Tensor,存储区 Storage)

    1. Tensor 内部存储结构 tensor 数据结构如下图所示,tensor 分为头信息区(Tensor)和存储区 (Storage),信息区主要保存着 Tensor 的形状(size).步长(s ...

  2. 数据结构和算法:(3)3.2线性表的链式存储结构

    线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素也就是说你这个可以放在A地点,这个可以放在E地点,A地点和E地点中间可以隔开一个C地点和D地点,这样是允许的),这组存储单元可以存在 ...

  3. 数据结构与算法(6-2)二叉树的存储结构(顺序存储、链式存储)

    目录 一.二叉树的顺序存储 存储方式 总代码 二.二叉树的链式存储(二叉链表) 1.存储结构 2.创建二叉树 总代码 一.二叉树的顺序存储 存储方式 //树的顺序存储 typedef struct { ...

  4. 存储结构分四类:顺序存储、链接存储、索引存储 和 散列存储

    存储结构分四类:顺序存储.链接存储.索引存储 和 散列存储. 顺序结构和链接结构适用在内存结构中. 顺序表每个单元都是按物理顺序排列的,如果你想访问那个单元你可以根据提供的指针等直接访问到需要的东西, ...

  5. 3.3 栈的链式存储结构

    <?php header("content-type:text/html;charset=utf-8"); /*** 栈的链式存储结构的基本操作**包括* 1.初始化 __c ...

  6. 利用链式存储结构实现线性表

    本图文主要介绍了如何利用链式存储结构实现线性表.

  7. 链表list(链式存储结构实现)_5 线性表的链式存储结构

    系列文章参考资料为<大话数据结构>,源码为个人私有,未经允许不得转载 线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素,可以使连续的,也可以不连续,也就意味这些元素可以 ...

  8. 4-2-串的堆存储结构-串-第4章-《数据结构》课本源码-严蔚敏吴伟民版

    课本源码部分 第4章  串 - 堆串 --<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接☛☛☛ <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解 ...

  9. 二叉排序树的存储结构和增删查改

    顺序存储结构 #include <stdio.h> //用顺序数组的形式,存储建立一个二叉搜索树 /* 1,我们根据完全二叉树的编号,我们做数组角标1存储输入的第一个元素 2,得到根元素之 ...

最新文章

  1. IE9最终版透露IE10信息 或将自动在线升级
  2. 纯Shading Language绘制飞机火焰效果
  3. ASP.NET Aries 3.0发布(附带通用API设计及基本教程介绍)
  4. 删除word中所有的表格_如何在Word中删除表格
  5. 实例26:python
  6. 微信小程序 - 展开收缩列表
  7. 3.代码托管仓库 - GitHub
  8. SQL中代替Like语句的另一种写法
  9. 电力系统matlab实验报告,电力系统分析潮流实验报告
  10. iOS 注册极光推送
  11. C++ 捕获程序异常奔溃minidump
  12. Oracle查询结果随机排序(去重,抽检)
  13. 火狐浏览器添加restclient.xpi 添加插件时候遇见的 附件未经验证无法安装
  14. python debug配置launch.json例子
  15. 华为LTC流程再造(BPR)的来龙去脉,看一篇文就够了!管理变革专家许浩明老师
  16. 单样本t检验、独立样本t检验、配对样本t检验_python_数据分析_7
  17. 淘宝直播接口分析!!! 测试!!!
  18. 如何设置无线路由器,实现WIFI上网?
  19. 概率论的一些基本概念
  20. flv.js php,B站视频开源代码flv.js+HTML5无flash播放视频

热门文章

  1. flyme禁止系统更新_Flyme系统更新最新版本
  2. 白痴学日语系列之模拟题
  3. matlab gpu cpu 快,(Matlab)GPU计算简介,及其与CPU计算性能的比较
  4. [Maven] The Super POM
  5. 低代码在ERP系统实施中的作用
  6. MATLAB 数学应用 微分方程 边界值问题 使用延拓求解BVP问题
  7. 振动盘的底盘有哪几种类型
  8. 调节效应是否需要考虑对控制变量交乘?
  9. 宗海图绘制的关键问题
  10. 2011级-csdn-java-张侃— struts2的优点