PNG文件结构最简单解析(生成)

前言

本想写个从.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
  • 4
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值