前言
本想写个从.wdf提前资源的生成位图的程序,无奈.bmp没有A(透明色),.gif编码复杂,所以选择.png作为理想的图片格式,饶了许多弯路,发出来与各位分享心得
PNG的文件结构
由文件头+各种各样的PNG数据块Chunk组成(其中最主要是的IHDR(图像描述信息,如宽度,高度,是否真彩色..),IDAT(图像数据),IEND(文件尾终止符)),顺序也这样
这是生成的1x1一个红色像素的PNG图片
Chunk
PNG数据块Chunk 由 数据块长度,数据块标识,数据内容,CRC校验码组成
如 IHDR CHunk
名称 | 描述 |
---|---|
文件头 | 0x89,0x50,0x4E,0x47,0x0D,0x0A,0x1A,0x0A (ASCII为’.PNG….’ 一共8个字节 生成文件时直接复制) |
IHDR | 图像描述信息,如宽度,高度,是否真彩色.. |
IDAT | 图像数据 |
IEND | 文件尾终止符 |
各个字段解析如下 类型只选了最简单的
class Chunk
{
public:
DWORD ChunkLen;//ChunkLen 不算 ChunkLen,Tag,CRC的长度
DWORD Tag;//4byte
DWORD CRC;效验码
};
class IHDR : public Chunk
{
public:
DWORD Width;//宽
DWORD Height;//高
BYTE BitDepth;//位深 真彩色图像:8或16
BYTE ColorType;//颜色类型 6:带α通道数据的真彩色图像,8或16
BYTE CompressionMethod;//压缩方法(LZ77派生算法) 固定0
BYTE FilterMethod;//滤波器方法 固定0
BYTE InterlaceMethod;//隔行扫描方法:0:非隔行扫描 1: Adam7(由Adam M.Costello开发的7遍隔行扫描方法)
};
class IDAT :public Chunk
{
public:
BYTE* CompressData;//zib压缩数据
DWORD CompressDataLen;//zib压缩数据长度(这个这是我个人加的,方便复制数据 文件结构里面没有这个)
}
class IEND :public Chunk
{
//没有数据
}
IDAT
IDAT 像素数据是顺序排列 (最左上角的像素点在buff最前面,最右下角的像素点在buff最尾端 ),每个像素(32位的图片)点由 红(8)绿(8)蓝(8)A(8)组合, 每行像素点开始需要多加一个0 如下面1x2的图片
,整个像素数据是zib压缩(算法。。。)这个怎么用 我已经写在代码里了
生成png源码
#include <Windows.h>
#include <iostream>
#include <io.h>
#include "zlib.h"
#pragma warning( disable