对PNG图像进行编码 Encoding the PNG image

英文原文:https://www.w3.org/TR/PNG/#4Concepts.Encoding

转载请注明出处 https://blog.csdn.net/weixin_43873389/article/details/121734662

灰色背景为个人理解

4.5 对PNG图像进行编码

4.5.1 引言

    PNG图像编码过程的概念模型如图4.7所示。下列步骤适用于像素数组或索引数组的编码。调色板和alpha表不是以这种方式编码的。

    a. 通道提取(Pass extraction):为了进行渐进式显示(先显示模糊的图像,再逐渐填充细节),可以重新排列 PNG 图像像素以形成多个较小的图像,称为缩小图像或通道(reduced images or passes)。如果网速慢的话看的挺明显的,一开始图片非常模糊

    b. 扫描线序列化(Scanline serialization):图像被序列化,成为一条一条的扫描线(scanline)。像素在扫描线中从左到右排序,扫描线从上到下排序。如果需要交错的话,扫描线应该就不是原图像的一行的全部像素了

    c. 过滤(Filtering):通过几种特定的过滤方式,每条扫描线被转换为过滤后的扫描线(filtered scanlines),为下一步的图像压缩做准备。

    d. 压缩(Compression):图像的所有过滤后的扫描线都会被压缩。

    e. 分块(Chunking):压缩后的图像被分成大小合适的块(chunk)。错误检测码(CRC32)被添加到每个块的结尾。这个就是idat块了吧

    f. 数据流构造(Datastream construction):各个块被插入到数据流中(datastream)。形成最后的png文件

图4.7 PNG图像编码
图4.7 PNG图像编码

4.5.2 通道提取(Pass extraction)

    通道提取(见图 4.8)将一个 PNG 图像分割成一系列缩小图像,其中第一个图像定义了一个粗略的视图,随后的图像优化这个粗略的视图使其更清晰,直到最后一个图像填补完成了 PNG 图像。这组缩小图像也称为交错 PNG 图像(interlaced PNG image)。本国际标准定义了两种交错方法。第一种方法是空方法;像素从左到右依次存储,扫描线从上到下依次存储。第二种方法对图像进行多次扫描以生成七个缩小图像的序列。图 4.8说明了样本图像的七次传递。见第 8 节 交错和通道提取

图4.8 通道提取

4.5.3 扫描线序列化(Scanline serialization)

    一行像素,称为扫描线,以字节序列表示。如果没有交错,那么一条扫描线就是原图像的一行,如果交错了(也就是形成了七个reduced image),那么一条扫描线就是reduced image的一行

4.5.4 过滤(Filtering)

    PNG 标准化了一种过滤方法(filter method)和几种过滤类型(filter types),用于生成可以被压缩的图像数据。它将扫描线的字节序列转换为等长字节序列,等长字节序列前是一字节的过滤类型(见图 4.9)。过滤类型字节定义了要应用于该条扫描线的过滤方式。对于一个交错PNG图像,编码器应使用单一的过滤方法,但对于缩小图像中的各条扫描线可以使用不同的过滤类型。参见第 9 条:过滤应该是因为过滤方法存在png头 ihdr段里的一字节,ihdr段只能有一个。然后过滤类型存在每条扫描线的开头所以可以有很多种

图中右侧的文字描述的很绕口,根据我的理解:图中原扫描线存了5项,每项都是一个像素(每个像素都有红 绿 蓝 透明度 四个值),现在将每项的像素转换成字节形式存起来,并在字节数组前头加一个字节记录过滤类型。

又有了新的理解:过滤类型不同,像素转成的字节也不同。一共五种类型,第一种应该是没变化。其他的 与该像素的左侧像素,左上像素和上方像素有关,以达到减少字节的目的。(参考https://blog.csdn.net/helimin12345/article/details/108210763#t3

图4.9 序列化并过滤一条扫描线

4.5.5 压缩(Compression)

    在PNG 图像的一个或多个通道(pass or passes)中的过滤扫描线序列 使用已定义的一种压缩方法进行压缩(见图 4.10)。按顺序首尾相连的过滤扫描线形成压缩阶段的输入。压缩阶段的输出是单个压缩数据流(compressed datastream)。参见第 10 条:压缩

将第二条过滤扫描线排到第一条过滤扫描线的结尾处。。。依次将同一通道(即缩小图像)内的所有条扫描线组成一个字节数组。其他通道一样操作,再将第二个通道的字节数组排到第一个通道后。。。这样就把一张图像的所有像素都放在这个大字节数组里了。然后压缩,再将压缩后的字节数组均匀分块装到各个idat里即可。这样排序的好处是:在网络中传输时,最先接收到的字节流就是第一个通道里的扫描线,这样即使第二个通道还没传过来,也可以现将第一个通道的内容显示出来,而第一个通道的内容就是最粗糙模糊的缩小图像。这样就实现了逐渐显示图像的目的。

图4.10 压缩

4.5.6 分块(Chunking)

    分块可以方便地将压缩数据流划分为易操控的块(见图 4.10)。每个块都有自己的冗余检查。参见第 11 条:块规格这就是分成idat了,关于idat的格式网上有的是了,也可以下个010editor十六进制编辑器,里面有png的模版,加载png后可以自动分块

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值