在过去的几十年里,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. OSI七层 TCP/IP四层 TCP/IP协议栈: 不同的通信协议的大集合
  2. 清华鲁继文团队提出DynamicViT:一种高效的动态稀疏化Token的ViT
  3. java filter 返回错误消息_java filter 导致错误310
  4. hash 数据类型的应用场景
  5. 武汉计算机985211大学有哪些,武汉985211大学有哪些 武汉985211大学有什么
  6. .NET core3.1使用cookie进行身份认证
  7. 李迟2022年2月知识总结
  8. Mysql学习总结(74)——慢SQL!压垮团队的最后一根稻草!
  9. 【ARM-Linux开发】DRM学习(一)
  10. (设计模式之一)浅析简单工厂模式
  11. java并查集找朋友圈_并查集求朋友圈最大人数
  12. 为什么使用梯度下降法或者梯度上升法
  13. 系泊系统 matlab 代码,系泊系统的设计
  14. c# 抓取数据的3种方法
  15. Luminar 4:AI 人像照片增强器
  16. HTML空白字符占位问题
  17. 【电商支付项目(一)】数据库设计
  18. 关于oracle数据库死锁的解决 以及产生的原因
  19. python pandas操作excel表
  20. 模型计算算力_8核人工智能开源主板_基于 BITMAIN AI 计算模组_3.5寸

热门文章

  1. Python安装最新版最详细教程(3.10.2)
  2. 引导页 设置只显示一次
  3. 嵌入式C语言编程课件,嵌入式系统C语言编程基础PPT课件
  4. mysql限制类别_MySQL限制每个类别的结果
  5. vue-cli3中安装lib-flexible和px2rem
  6. vue安装less并全局引入less/sass文件
  7. iphone图片编辑画笔_苹果超强新功能上线!它打开了 iPhone 摄影的新大门
  8. 量子计算机能让科技发展有多快,量子计算机有多快?
  9. java thread setname_Java Thread setName()方法
  10. tp中的M,D,C,A,I,S方法