大家好,今天来为大家解答音视频基础教程入门指南这个问题的一些问题点,包括也一样很多人还不知道,因此呢,今天就来为大家分析分析,现在让我们一起来看看吧!如果解决了您的问题,还望您关注下本站哦,谢谢~
PNG 文件格式解析
PNG图像格式文件由8字节PNG文件签名字段和3个以上后续数据块(IHDR、IDAT、IEND)组成。
PNG 文件包含一个8 字节文件签名(89 50 4E 47 0D 0A 1A 0A,十六进制),用于标识PNG 格式。
使用十六进制查看器打开任何PNG 文件,您将看到像这样的标题:
png-hex-file-signture.pngPNG定义了两种类型的数据块:一种是PNG文件必须包含且必须得到读写软件支持的关键块;另一种是PNG文件必须包含的关键块,并且必须得到读写软件的支持。另一个称为辅助块。块),PNG 允许软件忽略它无法识别的其他块。这种基于块的设计允许PNG 格式在扩展时保持与旧版本的兼容。
数据块总览
下表显示了PNG数据块的类别。关键数据块部分突出显示以区分:
数据块符号数据块名称多个数据块可选位置限制IHDR 文件头数据块无无第一个块cHRM 基色和白点数据块无有在PLTE 和IDAT 之前gAMA 图像 数据块无有在PLTE 和IDAT sBIT 样本有效之前位数据块no yes PLTE 和IDAT 之前PLTE 调色板数据块no yes IDAT 之前bKGD 背景颜色数据块no yes PLTE 之后IDAT 之前hIST 图像直方图数据块no yes PLTE 之后IDAT 之前tRNS 图像透明度数据块No Yes PLTE 之后IDAT 之前oFFs(私有公共数据块) 否是在IDAT pHYs 物理像素大小数据块之前否是在IDAT sCAL(私有公共数据块)之前否是在IDAT 之前IDAT 图像数据块是否与其他IDAT TIME 图像上次修改时间数据块连续否是无限TXT 文本信息数据块是是无限zTXt 压缩文本数据块是是无限fRAc(私有公共数据块) 是是无限GIFg(私有公共数据块) 是是无限gIFt(私有公共数据块) 是是无限gIFx( Private Common Data Block) Yes Yes Unlimited IEND Image End Data No No Last data block 我们现在只需要关注关键数据块。
数据块中有4个关键数据块:
文件头数据块IHDR(header chunk):包含图像基本信息,作为第一个数据块出现,仅出现一次。调色板数据块PLTE(palette chunk):必须放在图像数据块之前。图像数据块IDAT(图像数据块):存储实际的图像数据。 PNG 数据允许包含多个连续的图像数据块。图像结束数据IEND(image Trailer chunk):放置在文件的末尾,表示PNG数据流的结尾。数据块连接在一起,如下所示:
PNG标识符PNG数据块(IHDR) PNG数据块(其他类型的数据块). PNG结束数据块(IEND)
数据块结构
在一个PNG文件中,每个数据块(如IHDR、IDAT等)由共4 部分:
Name Number of Bytes Description Length(长度) 4 字节指定数据块中数据字段的长度,长度不超过(2^31-1)字节Chunk Type Code(数据块类型代码) 4 字节数据块类型code 由ASCII 字母(A-Z 和a-z)组成Chunk Data(数据块数据) 根据Chunk Type Code 指定的数据的变长存储CRC (Cyclic RedundancyDetection) 循环冗余码的4 字节存储CRC 用于检测是否存在错误(循环冗余校验)字段中的值是根据块类型代码字段和块数据字段中的数据计算的。注:Length 的值为除length 本身、Chunk Type Code、CRC 之外的长度,即Chunk Data 的长度。
数据块-文件头数据块 IHDR
包含PNG文件中存储的图像数据的基本信息,应作为PNG数据流中的第一个数据块出现,并且一个PNG数据流中只能有一个文件头数据块。
文件头数据块由13个字节组成:
字段名称字节说明Width4 字节图像宽度,以像素为单位Height4 字节图像高度,以像素为单位位深度1 字节图像深度:索引彩色图像:1、2、4 或8 灰度图像:1、2、4、8 或16 true彩色图像:8或16ColorType1字节颜色类型:0:灰度图像,1、2、4、8或162:真彩色图像,8或163:索引彩色图像,1、2、4或84:带alpha通道的灰度图像data, 8 或166:带alpha 通道的真彩色图像数据,8 或16 Compression method1 bytePNG Spec 指定这始终为0,表示使用压缩方法(LZ77 派生算法) Filter method1 bytePNG Spec 指定这始终为0 0、过滤方式Interlace method1 字节隔行方式: 0:非隔行1:Adam7(Adam M. Costello 开发的7-pass 隔行方式) 用十六进制查看器打开PNG 文件:
png-hex-ihdr.png 十六进制描述00 00 00 0D 数据块长度13 个字节49 48 44 52 数据块类型代码“IHDR” ASCII 字母00 00 04 1D 图像宽度105300 00 02 B3 图像高度69108 图像深度806 真彩色图像带alpha 通道数据00 压缩方式00 滤波方式00 隔行方式:00 非隔行52 C3 75 3ACRC(循环冗余检测)
数据块-调色板数据块 PLTE
包含与索引颜色图像)相关的颜色变换数据,仅与索引颜色相关图像并且必须放置在图像数据块之前。
PLTE数据块定义了图像的调色板信息。 PLTE可以包含1~256个调色板信息。每个调色板信息由3个字节组成:
颜色字节含义Red1 byte0=黑色,255=红色Green1 byte0=黑色,255=绿色Blue1 byte0=黑色,255=蓝色蓝色调色板的长度应为3 的倍数,否则为非法调色板。
对于索引图像,调色板信息是必要的。调色板的颜色索引从0开始编号,然后是1、2…,调色板中的颜色数量不能超过颜色深度中指定的颜色数量(比如图像颜色深度为4时,调色板中的颜色数量不能超过2^4=16),否则,这将导致PNG图像非法。
真彩色图像和带有alpha通道数据的真彩色图像还可以有调色板数据块,非真彩色显示程序使用这些数据块来量化图像数据,以便可以显示图像。
使用十六进制查看器打开索引图像PNG 文件:
png-indexed-color-hex-plte.png 十六进制描述00 00 00 27 数据块长度39 字节50 4C 54 45 数据块类型代码“PLTE” ASCII 字母B7 00 34FF 99 0060 00 73FF 0F 00FF ED 0009 00 B2FF 66 00FF 3B 00E2 00 158B 00 54FF C1 0033 00 99FF FF 00调色板颜色13 48 29 75 2CCRC(循环冗余检测)调色板中的预览颜色:
indexed-color-plte-colors.png
数据块-图像数据块 IDAT
它存储实际数据,数据流可以包含多个连续的顺序图像数据块。
IDAT存储的是图像的真实数据信息。因此,如果我们能够理解IDAT的结构,我们就可以轻松生成PNG图像。
使用十六进制查看器打开索引图像PNG 文件:
png-hex-idat.png 十六进制描述00 00 00 D3 数据块长度211 字节49 44 41 54 数据块类型代码“IDAT”的ASCII 字母78 9C. 压缩数据211 字节,LZ77 导出的压缩方法52 98 5D 9DCRC (循环冗余检测)图像数据块 IDAT 细节在本文下半部分有详细分析
数据块-图像结束数据 IEND
用于标记PNG文件或数据流的结束,必须放在文件的末尾。
如果我们仔细观察PNG 文件,我们会发现文件的最后12 个字符应该始终如下所示:
00 00 00 00 49 45 4E 44 AE 42 60 82
使用十六进制查看器打开PNG 文件:
png-hex-iend.png 由于数据块结构的定义,IEND数据块的长度始终为0(00 00 00 00,除非人为添加信息),数据标识符始终为IEND(49 45 4E 44)。因此,CRC 码也始终为AE 42 60 82。
图像数据块 IDAT 细节
IDAT 压缩数据细节
在PNG Spec 压缩算法部分:
PNG 压缩方法0 是deflate/inflate 压缩,滑动窗口(这是deflate 流中出现的距离的上限)最多为32768 字节。 Deflate 压缩是LZ77 的衍生版本[ZL]。
PNG 中的Deflate 压缩数据流以“zlib”格式存储,其结构为:
- zlib 压缩方法/标志代码1 字节
- 附加标志/检查位1 字节
- 压缩数据块n字节
- 检查值4 字节
zlib 规范[RFC-1950] 中给出了有关此格式的更多详细信息。 PNG 使用DEFLATE 压缩算法。 DEFLATE是一种无损数据压缩算法,同时使用LZ77算法和霍夫曼编码。 DEFLATE 压缩数据以zlib 格式存储。 zlib(RFC1950):是一种简单封装deflate的格式。它也是一个实现库(Delphi中包含zlib和zlibex)
gzip(RFC1952): 是一种也封装deflate 的格式。
gzip=gzip header + deflate 编码的实际内容+ gzip Trailer
zlib=zlib header + deflate 编码的实际内容+ zlib tail
提取解压 IDAT 中压缩数据
适用于Windows [hexeditor](https://www.hhdsoftware.com/free-hex-editor)
在Mac 上,可以使用[hexfiend](http://ridiculousfish.com/hexfiend/)、[Hopper Disassembler](https://www.hopperapp.com/)png-hex-idat-data-extract.png 使用zlib 解压78 9C. 压缩数据字节:
#include#include#include#include "zlib.h"
int main() {
FILE *inFile=fopen("/Users/staff/Desktop/indexed-color-image.data", "rb");
FILE *outFile=fopen("/Users/staff/Desktop/indexed-color-image-uncompress.data", "wb");
fseek(inFile, 0L, SEEK_END);
长尺寸=ftell(inFile);
fseek(inFile, 0L, SEEK_SET);
uint8_t dataBuf[大小];
fread(dataBuf, 大小, 1, inFile);
printf("压缩文件大小: %ldn", size);
uint8_t destBuf[1500000]={0};
uint32_t destLen=0;
解压缩(destBuf,destLen,dataBuf,大小);
printf("解压后的大小: %dn", destLen);
fwrite(destBuf, destLen, 1, outFile);
fflush(outFile);
fclose(inFile);
fclose(outFile);
返回0;
}png-hex-idat-uncompress.png
PNG Spec 7.1 中的png-hex-idat-uncompress-contrast.png
分析解压后的数据
整数和字节顺序
所有需要多于一个字节的整数均应采用网络字节顺序(如图7.1 所示): 首先是最高有效字节,然后按重要性降序排列较低有效字节(对于两字节整数,MSB LSB,MSB B2 B1 LSB(四字节整数)。字节的最高位(值128)编号为位7;最低位(值1)编号为位0。除非另有说明,否则值都是无符号的。明确标注为有符号的值以二进制补码表示法表示。PNG 使用网络字节顺序Big Endian。在PNG Spec 7.2 扫描线中
在颜色类型0(灰度)的PNG 图像中,每个像素都是单个样本,其精度可能小于一个字节(1、2 或4 位)。这些样本被打包成字节,最左边的样本位于字节的高位中,后面是扫描线的其他样本。
在颜色类型3(索引颜色)的PNG 图像中,每个像素都是一个调色板索引。这些索引以与颜色类型0 的样本相同的方式打包为字节。深度小于1 字节的PNG 图像将打包为字节。在PNG Spec 7.3 中过滤
PNG 允许在压缩扫描线数据之前对其进行过滤。过滤可以提高数据的可压缩性。过滤器步骤本身会产生与传入序列大小相同但表示不同的字节序列,前面有过滤器类型字节。过滤不会减少实际扫描线数据的大小。所有PNG 滤镜都是严格无损的。
不同的滤波器类型可以用于不同的扫描线,并且通过滤波器类型字节为每个扫描线指定滤波器算法。过滤器类型字节不被视为图像数据的一部分,但它包含在发送到压缩步骤的数据流中。智能编码器可以将滤波器从一条扫描线切换到下一条扫描线。选择使用哪个滤波器的方法留给编码器。每条扫描线前有一个字节来指定过滤器类型。 PNG 规格滤镜:
过滤对PNG 图像进行转换,目的是提高压缩率。 PNG 允许使用多种过滤方法。隔行扫描图像中的所有缩小图像均应使用单一滤波器方法。本国际标准仅定义了过滤方法0。其他过滤方法保留用于未来标准化(参见4.9 扩展和注册)。滤波器方法0 提供一组五种滤波器类型,每个缩小图像中的各个扫描线可以使用不同的滤波器类型。文件头数据块IHDR中的Filter method只能为0。Filter method=0定义了5种Filter Type滤镜类型:0:None、1:Sub、2:Up、3:Average和4:Paeth。当PNG 图像是索引图像时(数据如下:图像深度: 4 尺寸256X256 滤镜类型: 0:None Interlacing Method:0:Non-Interlaced):
索引颜色图像.png
png-indexed-color-uncompress-data.png 每个突出显示区域前面的字节00 表示滤镜类型:0:None [PNG Spec 7.3 Filtering] [PNG Spec Filters]。如果高亮区域的前一个字节不为00,则高亮区域将不是扫描线索引数据。您需要参考[PNG Spec 9.2 滤镜方法0的滤镜类型]。每种颜色突出显示的128 字节是扫描线颜色。索引数据,因为图像深度:4,所以每个字节代表两个颜色索引[PNG Spec 7.2 Scanlines]。例如,字节55 是十六进制,01010101 是二进制。前四位表示颜色索引0101,十进制为5,后四位表示颜色索引0101,十进制为5。当PNG图像为真彩色图像时(数据如下:图像深度: 8尺寸70X70滤镜类型: 0:None interlacing method:0:non-interlaced):
真彩色图像.png
png-true-color-uncompress-data.png 每个突出显示区域前面的字节00 表示滤镜类型:0:None [PNG Spec 7.3 Filtering] [PNG Spec Filters]。如果高亮区域的前一个字节不为00,则高亮区域将不是扫描线颜色数据。您需要参考[PNG Spec 9.2 滤镜方法0的滤镜类型]。每种颜色突出显示的210 字节是扫描线颜色。数据方面,因为真彩色图片图像深度:8,所以每三个字节代表一个像素颜色。例如,字节FF 00 00 表示像素的RGB 颜色。
More
在下一步中,您将使用代码手动生成PNG 图像。文章目录:*音视频条目文章目录*。
所有可能问题的答案:PNG 规范。
代码:
演示/演示-zlib
参考:
PNG文件格式详细解释
PNG、JPEG、BMP等图像格式详解(一)—— PNG
PNG文件结构详解
《PNG文件格式》(2)PNG文件格式分析
图像知识整理(一): PNG文件结构
隐写技术——使用PNG文件格式隐藏Payload
便携式网络图形(PNG) 规范和扩展
gzip、deflate、zlib分析
【音视频基础教程入门指南】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
我一直想学习做短视频,但是不知道从哪里开始!这篇文章正好是!
有9位网友表示赞同!
最近看了一些厉害的抖音,感觉他们的视频制作太专业了,我想看看文章里有没有简单易懂的入门方法。
有17位网友表示赞同!
我想要提升自己制作音频和视频的能力,准备学习一下基础知识。
有13位网友表示赞同!
终于找到一本适合初学者的音视频教程!
有12位网友表示赞同!
想了解一下音视频行业的基本原理,这篇文章能不能帮我?
有9位网友表示赞同!
刚开始接触音视频编辑软件,感觉很多功能都不懂啊,不知道这本书会不会有详细的介绍。
有17位网友表示赞同!
期待学习一些制作高质量音频和视频的小技巧!
有16位网友表示赞同!
最近想做一些简单的视频分享,希望能从入门博文中获得帮助。
有19位网友表示赞同!
我一直对音视频特效很感兴趣,希望这篇文章能让我了解一些常用效果的制作方法。
有16位网友表示赞同!
学习一下音视频知识,可以提高我未来的工作能力吧!
有5位网友表示赞同!
文章介绍是否包含常用的软件和硬件工具?我很想尝试使用它们!
有20位网友表示赞同!
希望能从入门博文中了解音视频创作的基本流程。
有7位网友表示赞同!
看完了这篇文章后,我想能够自己制作一些简单的视频了!
有8位网友表示赞同!
这篇文章看起来很有实用性,正好可以帮助我在做直播时提升质量。
有11位网友表示赞同!
我一直想学习剪辑视频,这篇文章能让我一步步入门吗?
有14位网友表示赞同!
感觉文章内容很全面,涵盖了音视频创作的多个方面!
有16位网友表示赞同!
我会把这篇文章分享给我的朋友,他也对音视频制作感兴趣!
有15位网友表示赞同!
期待学习到更多关于音视频的知识和技巧!
有12位网友表示赞同!
希望能够从入门博文中找到一些制作高质量音频的小窍门!
有20位网友表示赞同!