在未得到原作者的同意下转载,特地在此贴出源地址以作声明:http://wmnmtm.blog.163.com/blog/static/38245714201062355618241/
--------------------------------华丽的分割线----------------------------
下面将讲解在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;
|