在过去的几十年里,PNG(便携式网络图形)已经成为应用程序开发的主要部分。从游戏开发到web开发,再到Android开发,它无处不在,这意味着它被广泛采用,但也有被广泛滥用的机会。

正如我之前所讨论的,PNG提供了一种不错的高分辨率图像格式,但这意味着在数据压缩方面还有很大的改进空间。但是在我们开始讨论如何进一步压缩PNG文件之前,我们必须先讨论格式是如何工作的。

了解压缩

PNG的压缩过程是完全无损的;这意味着压缩文件可以准确地重建源图像。分两个阶段完成:预测(又名过滤)和压缩。

1 过滤器(预测)

增量编码是最强大的数字压缩方法之一,基本思想是您可以将任何值表示为与前一个值不同的值,所以:

[2,3,4,5,6,7,8]会变成[2,1,1,1,1,1,1],其中 [2, 3-2=1,4-3=1, 5-4=1, 6-5=1, 7-6=1, 8-7=1]

这之所以如此强大,是因为如果数据是线性相关的(也就是说,值与前一个值有一些很小的差异),那么最终会将数据集的值转换为大量重复的小值,这些小值更容易被压缩。 PNG格式使用称为“filtering”的delta编码格式。基本上,对于每一个像素扫描线,当前像素都是按照与左边像素、上面像素和上面左侧像素的某种关系进行编码的。

例如,如果我们用A和B的平均值的差值(X-(((A + B)/2)来编码一个给定的像素,那么我们会得到:

过滤器使用用ABC来预测x的值,使用预测值和实际值之间的差来代替X的值。

现在,值得注意的是,每一行只有很小的差异,PNG允许选择五种模式中的一种,每行:

  1. 不使用filtering
  2. X和A的差
  3. X和B的差值
  4. X与(A + B)/2的差值(即平均值)
  5. Paeth预测器(A,B,C的线性函数)

这里的意图是,每一行都可以为自己选择最好的filtering方法,这样就可以产生最少的唯一符号(重复符号越多,压缩效果越好)。这是我们每个模式的原始例子:

需要注意的是,这些过滤器是按通道而不是按像素设置的。这意味着该过滤器应用于扫描线的一个像素的所有红色值,然后单独应用于扫描线的所有蓝色值(尽管一行中的所有颜色将使用相同的过滤器)。

PNG格式有一些很好的方式来选择在一个通道上使用哪个过滤器;虽然蛮力是最直接的,但结果并不理想,相反,开发人员在不同的图像类型上进行了试验,并提出了一些接近最优的经验法则:比如对调色板图像以及低于8位的灰度图像不使用过滤器;对于其他的图像,选择最小化绝对差和的滤波器;不是使用256模除(%),而是使用标准的带符号数学,然后获取abs值,并将它们全部添加到给定行中,然后比较其他筛选器类型的和,选择给出最小和的过滤器。

2 压缩(DEFLATE)

一旦在扫描线上进行了滤波,它将传递给LZ77算法的变种,称为DEFLATE;该算法结合了LZ77编码和一个霍夫曼编码器。它与PKWARE、PKZIP、GZip等压缩器几乎相同。这个实现是开箱即用的标准,但是对于图像数据有一些有趣的注意事项:

  1. Deflate限制3到258个符号之间的匹配长度;这使得可以想象的最大压缩比约为1032:1。
  2. 如果匹配的符号小于3个,那么您将产生一些开销(overhead)来表示符号

这两个的结果,意味着如果在扫描线中找到匹配项,图像的大小可能会有影响。

考虑下面这张图,270x90版本只有20k,但是270x92版本大了2倍。

从逻辑上看,这似乎是错误的。在一张图片上增加540个像素应该不会导致2倍的压缩膨胀。然而,当我们仔细观察时,我们可以看到为什么会发生这种情况,下面的图像热图表示给定像素的压缩程度。深蓝=高度压缩,黄色/红色=非高度压缩(压缩率不高)

之所以发生这种情况,虽在较小的图像中,扫描线有更多的匹配,因此有更好的压缩率。但是,稍微调整一下大小,就会改变可能出现的匹配类型,一些可能的匹配对象现在在我们的LZ窗口之外,因此没有被匹配,导致文件变大。

原文链接 https://medium.com/@duhroach/how-png-works-f1174e3cc7b7

为什么存png还有白色底_PNG的算法原理相关推荐

  1. 为什么存png还有白色底_用photoshop保存透明背景的图片为png格式,为什么打开后是白色背景了?...

    Photoshop想要保存透2113明背景的图片要保存PNG格式,保存JPG格式就5261会变成图片.41021.电脑打开Photoshop.2.打1653开Photoshop后,打开一张图片.3.打 ...

  2. mysql主存 辅存_MySQL索引背后的数据结构及算法原理(转载)

    MYSQL索引数据结构请参考如下链接: 外存储器-磁盘介绍: 计算机存储设备一般分为两种:内存储器(main memory)和外存储器(external memory). 内存存取速度快,但容量小,价 ...

  3. 电子签名生成的图片为空白,以及生成透明底签名图片转为白色底

    电子签名如何解决生成的图片为空白的问题,以及生成透明底签名图片转为白色底 一.生成的图片为空白 项目有个新需求需要加电子签名,在实现的过程中遇到了许多问题,现用的插件笔画延迟非常严重,好不容易做完之后 ...

  4. Greenplum 行存、列存,堆表、AO表的原理和选择

    转载自: https://github.com/digoal/blog/blob/master/201708/20170818_02.md?spm=a2c4e.11153940.blogcont179 ...

  5. Coco2d-x 3.x : Cocos Studio 制作的UI无法正确显示,出现绿色或白色底

    可以在论坛看到, 修改一处即可. 文件位置在: frameworks\cocos2d-x\cocos\platform\android\java\src\org\cocos2dx\lib\Cocos2 ...

  6. postgres默认安装后有哪些表_Greenplum 行存、列存,堆表、AO表的原理和选择

    行存和列存的原理 什么时候选择行存 什么时候选择列存 堆表和AO表的原理 什么时候选择堆表 什么时候选择AO表 测试对比行存deform和列存的性能差别 如何查看表的存储结构 Greenplum支持行 ...

  7. 【图论】有向无环图的拓扑排序

    1. 引言 有向无环图(Directed Acyclic Graph, DAG)是有向图的一种,字面意思的理解就是图中没有环.常常被用来表示事件之间的驱动依赖关系,管理任务之间的调度.拓扑排序是对DA ...

  8. css——模态框【遮罩层的制作;信息层;往白色的块里添加表单】

    目   录 1.遮罩层的制作 2.信息层 3.往白色的块里添加表单 1.遮罩层的制作 <!DOCTYPE html> <html lang="zh-CN"> ...

  9. 怎样抠图怎么把背景换成白色?几个步骤教你轻松掌握

    有时候我们一些照片背景色比较杂乱需要想要换成纯色,或者一些证件照需要更换白色底该怎么操作呢?相信一些制作简历,或者从事电商图片制作的小伙伴可能都遇到过这种问题,但是很多在线处理的小网页也不敢上传图片怕 ...

最新文章

  1. mysql 非正常关闭_mysql非正常关机,无法启动解决方案(转)
  2. c语言程序开发过程上机步骤,C语言程序上机步骤2010.doc
  3. python装饰器类-基于类的python装饰器
  4. Python IDE之Pydev: 基于Eclipse搭建python的编译环境(Eclipse+pydev)简介、安装、使用的详细攻略
  5. 101个MySQL的调节和优化的Tips
  6. matlab梯度检测,Matlab:关于梯度的一阶导数边缘检测
  7. win7怎么看服务器文件管理,Win7库文件管理器怎么用 Win7库功能及其使用方法详解...
  8. oracle日志表设计,数据库设计 – 数据库日志表结构
  9. 轮子一定要是圆的吗?
  10. FastDFS分布式文件系统设计原理
  11. python while循环if_初入python 用户输入,if,(while 循环)
  12. Python使用模糊哈希值比较文件相似度
  13. 多线程扫描网络计算机
  14. C语言之-fPIC编译与代码位置无关.a/.so库(二)
  15. java中什么是线程安全_Java 多线程:什么是线程安全性
  16. 软件测试工程师常见的面试题大全
  17. 安卓手机屏幕在电脑上实时同步显示
  18. 终于!LeCun发文驳斥Gary Marcus:别把深度学习暂时的困难当撞墙
  19. 万豪国际亚太区第1000家酒店开业!总客房数量超一半在中国 | 美通社头条
  20. 递归算法时间复杂度的数学证明过程(主定理)

热门文章

  1. linux终端默认密码是多少,linux基础懂多少?两个小问题考考你
  2. java栈和队列验证回文串_栈和队列的基本操作及其应用(回文判断)
  3. kafka时间轮linux时间轮,Kafka解惑之时间轮 (TimingWheel)
  4. 数据分析结果解读_聚类分析的实际运用及案例解读(二)
  5. php中的冒泡排序实例,PHP实现冒泡排序的简单实例,php冒泡排序_PHP教程
  6. mysql启动关闭步骤_MYSQL的连接管理与启动关闭流程
  7. android expandablelist 自动滚动,在ExpandableListView中,如何保留滚动位置_android_开发99编程知识库...
  8. Swift--字符串和字符(二)
  9. 什么?你竟然还没有用这几个chrome插件?
  10. Linux-- 查看文件 more与其它