三年前苹果这个决定,很多人不屑,如今疯狂打脸

 

....

前段时间发布的小米10系列手机采用了,一种新的图片格式:HEIF,能够在保持画质不变,的前提下缩减至少50%的文件体积。


▲图自:HEIF官网

HEIF格式照片的文件扩展名一般是.HEIC(也有其他的格式)。看到这个格式名,用iphone的小伙伴一定,很熟悉。
没错,苹果在2017年iOS 11系统上就已经开始支持,这种图片格式。

据汐元所知,苹果应该是最早在手机上广泛应用heif,图片格式的了,不过当时很多小伙伴对这个图片,格式不太了解,加上当年兼容性不好,给大家导图片,带来诸多不便,所以,很多小伙伴对苹果当时,的决定表示不屑,甚至不满。

感受一下当年很多,网友的评论:
包括汐元也是,因为做评测经常需要把,图片导到自己的windows电脑上,结果在电脑上打不,开这个格式,还要转格式,任务着急的时候真心想给,苹果寄刀片。

不过,时间证明,苹果的决定是对的,我错了。

后来,Windows 10系统和安卓9系统在2018年也开始,支持heif图片格式。同年,三星note9其实也已经,支持.HEIC照片。

小米10发布前,雷军甚至表示,等HEIF普及后,估计jpeg和gif,就可以淘汰了。
汐元觉得,未来如果HEIF普及了,也许真的可以,取代jpeg和gif。

写这句话的时候,汐元觉得脸上火辣辣得疼。
说到这里,相信大家都很好奇,heif究竟是怎么够做到,保证画质不变而缩小文件体积的?

汐元翻了一下网上的资料,大多没有明确针对这个问题,进行说明。所以这篇文章打算聚焦,这个问题来为大家介绍。

为什么heif相比jpeg能够在画质不变的情况下,将文件体积大幅缩小?

我们首先要明白jpeg的,图片格式具体是怎么样的。

所谓JPEG格式的图片,其实说的是一种图像压缩,的技术标准,使用这种标准压缩,出来的图片,就叫“JPEG文件”。

jpeg文件后缀名包括,jpg、JPEG、JPE、JFIF以及JIF。都是我们熟悉的。

那么jpeg标准是怎么压缩,图片的呢?

我们知道,一张图片放大后,就可以看到一个一个,的像素点。
每个像素点,都包含了描述这个,像素点颜色的一组数值,这个叫色彩空间,例如我们熟悉的rgb,色彩空间,还有CMYK色彩空间等。
一般照片用的是rgb,色彩空间,而jpeg标准采用的是,一种叫做ycbcr的色彩空间。所以压缩之前,要先进行色彩空间转换。
▲图自:wikimedia

YCbCr色彩空间中,Y表示的是亮度,Cb代表蓝色的彩度,Cr表示的是红色的彩度。

换句话说,Y代表亮度,CbCr代表色彩。

转换之后,每个像素背后变成,了另一组数值。

因为人眼对亮度敏感,对色彩不那么敏感,所以实际压缩的时候,jpeg标准不会对亮度信息,做太多改变,主要对色彩信息做压缩。

压缩有两种,一种是有损压缩,一种是无损压缩。JPEG在压缩时,两种都会用,一般先进行有损压缩,然后进行无损压缩。

有损压缩第一步是对cb通道和cr通道的色彩数据,按照一定的比例进行取样。这个过程就损失了,一部分数据。

第二步,就是将一张图片中的,像素分成无数个8×8像素的方块,每个方块里有64个像素,对应64组数据。


然后,将这64组数据进行一种叫,离散余弦变换(DCT)的数学处理,处理后,这64组数据就变成了,数据更简洁一些的系数矩阵。
至于这个离散余弦,变换怎么搞,就不用了解了,懂高数的it之家小伙伴可以,自行去学习。

总之,在经过DCT变换后,64组像素数值变成了,64个系数,这个过程又产生了,数据损失。

接下来,对于这一组8×,8的序数矩阵,还不能直接处理,要继续进行一步叫“量化”的处理过程。

量化是怎么进行的大家,不用知道,只需要知道,量化的目的是适当减小,矩阵内各个像素点之间的差别。因为人眼对小范围内差别,高的像素区域辨别能力不高,所以不如削减它们的差异。

经过量化处理后,8×8的序数矩阵,变成了一组更加简洁的数字矩阵,有大面积的0。
很显然,这一步,又损失了一部分数据。

好,走到这一步,接下来就是无损压缩了。

首先,我们把上一步量化后的8×8,数字矩阵提取出来。提取的顺序是这样“Z”字型的。
提取出来后,得到64个数据。这64个数据中,第一个数字叫,dc系数编码,后面63个数字叫ac,系数编码。
我们要知道,一张图片里可以包含很多很多个8,×8的小方块,都进行上述处理后,就有很多很多个DC系数。

我们把这很多很,多个dc系数抽出来,组成一个集体,然后对它们进行差分编码,和哈夫曼编码。

至于其他的AC系数,我们对他们进行行程编码。

这样,jpeg标准的压缩步骤,基本就走完了。

这些步骤走完后,压缩成的.jpg文件体积就会比原图,小很多,当然图片质量也,会有所损失。
但我们要说的还没完。

上面三种无损压缩编码的,操作过程大家不需要知道,但是他们的压缩思想,大家是有必要知道的。

差分编码,就是对于一串数字,除了第一个数字,其他数字都表示为它和前,一个数字的差。例如100、101、103、104、107这串数据,可以表示为100、1、2、1、3。这就起到了压缩作用。
哈夫曼编码,它的大体思想,在一串数据里,用短字符表示出现频率,多的数字,用稍长的字符表示出现频率,少的数字。

假如有下面这句话:“it之家网友在it,之家讨论it之家小编”,这句话里“IT之家”几个字反复出现,那我们就用“1”来表示“IT之家”,然后这句话就成了“1网友在1讨论1小编”,这样是不是就被压缩了?
注意,上面这个例子并不严谨,只是为了方便大家理解哈夫曼,编码的思想,实际操作很复杂的,要考虑概率、做二叉树等步骤的。如果有it之家小伙伴感兴趣,可自行学习。

行程编码,这就很简单了,直接用例子说明。假如有一串字符“aaabbbccccdddddd”,它包括3个a,3个b,4个c,6个d,所以就把它编码为“3a3b4c6d”。
很明显,要想让这些无损编码最大限度,发挥压缩作用,需要保证数据有一定特性,例如大面积相同的字符、有很多出现频率较高的字符或者有很多,相似的字符等。

讲到这,相信大家也就理解了为什么前面,要大费周章做那么多有损的处理了,一部分原因就是为了得到适合进行,无损压缩的数据。

通常情况下,一张图片里面,其实是有很多相同或,相近的像素点的,这意味着它们背后的数据有很大,可以压缩的空间。

jpeg目的就是要干这个,事儿的,这么说相信大家能理解。

说了那么多JPEG,那HEIF呢?

别急,当我们掌握了jpeg,图像压缩的方法,对于heif是怎样进一步压缩,图片体积的,就好理解多了。

其实heif做的工作和,jpeg差不多,大体路径是相似的,但在一些一些,细节上有改进。

我们需要先做一个简单,的说明。其实所谓的HEIF,是图片的封装格式,它主要采用的是,一种叫hevc的编码方式。

打个比方,一张图片的信息,它们其实是经过hevc,的编码方式进行编码,然后将编码后的信息,用一个盒子(容器)装起来,这个盒子就叫HEIF。
heif是把盒子和编码,方式分开了,而JPEG没有。

heif的这种操作方式和很多视频,格式很像,我们经常看到的MP4、MKV、AVI等视频格式,其实都是盒子的名字,盒子里面是编码的方式,例如MPEG-4、H.264、H.265等。

影音软件播放视频文件,的时候,都是先把盒子打开,然后再解码里面的,编码文件。

上面提到的H.265还有一个名字,就叫HEVC,没错,也就是heif格式主要采用,的编码方式,所以说这个图片格式其实,采用的也是视频的编码的方式。

除了HEVC,heif格式也可能采用其他,的编码方式,但很少见。它的编码方式和,对应的后缀名如下:
我们看到,小米10和iphone用的都是hevc,的编码方式,后缀名都是.HEIC。
所以问题就变成了,hevc的编码方式是,怎么将体积缩小的呢?

其实主要有两点。

首先,根据上文的介绍,jpeg是将图片划分成很多8×8的像素,块来进行压缩编码的。

而在HEVC编码方式中,这个像素块的划分方式,更灵活,最大可以允许以64×,64来划分,然后在64×64的,像素块中,可以灵活的划分子像素块,可以划分成32×32、16×16、8×8的子块,这叫做四叉树单元划分。
这么做有什么好处呢?答案就是,在面对一张图片的时候,如果是信息量比较平缓,的区域,我们可以用比较大,的像素块来划分,如果是信息量比较,密集的区域,就可以用比较小,的像素块来划分。
这种根据实际情况来,划分的编码单元,可以很大程度,提高编码效率。特别是针对4k,等高分辨率、像素量大的照片,优势更明显。

heif照片的文件,体积能够缩小,大部分要归结于此。

其次是第二点。前面介绍jpeg时我们讲了它使用的,几种无损编码方式,分别是差分编码、哈夫曼编码和行程编码。

这其中从编码之后,的数据量来说,其实最主要的,是哈夫曼编码,它是可以改进的。

在HEIF标准中,这种无损编码方式主要采用了自适应,的二进制算术编码(下面简称“算术编码”)。

其实,随着jpeg跟随,时代的发展,算术编码也被引入到,了jpeg的编码方式中,但是主要还是哈夫曼编码。

算术编码相比哈夫曼编码,可以进一步提高编码效率。

其实算术编码的思想原理和哈夫曼,编码是差不多的,都是考虑数据中不同字符,出现的概率,然后给不同字符以不同,的编码。

算术编码具体的数,学化思想很浓,难以三言两语讲清楚,这里也不方便展开说了。总之,算术编码最后得到的,是一个很简洁,但是很长的小数。

正是因为数学的,思想很深刻,算术编码的编码效率,要比哈夫曼编码更高,最后呈现在大家面前的,就是对于同一张照片可以压缩成,更小的体积。

以上,基本上就是heif能够在保证画质不变,的前提下缩小图片体积的原因了。

最后,关于HEIF,还有一些比较基础的知识,大家可以比较,轻松地了解到:

heif的全名是,高效率图像格式(High Efficiency Image Format),是运动图像专家组(MPEG)在2013年推出的。它和前面的,jpeg不是一个组织。

值得一提的是,heif的相关技术是,诺基亚的技术人员制定的,在2015年基本定型,现在也是诺基亚在维护。
有意思的是,heif的关键编码技术,hevc,华为正是主要推动者之一,手握大量专利,还在今年1月,加入了hevc Advance专利池。HEVC advance专利池中的关键,成员还有三星、联发科、皇家飞利浦等等。

当然啦,小米10凭借自身,的话题性,对heif图片格式的进一步,普及确实也起到了推动作用。

无论如何,汐元还是期待heif图片格式,能够克服困难,尽快普及,毕竟现在智能手机摄像头像素已经,能达到亿级了,jpg格式下手机的存储,空间确实吃紧。

毕竟,总不能只因为要存照片,就非得买更大存储空间的手机吧。

参考

  • 中国大学MOOC-长江大学公开课,2019-08-05,《静态图像压缩技术:JPEG编码(视频)》。
  • 中国大学MOOC-长江大学公开课,2019-08-05,《静态图像压缩技术:Huffman编码》。
  • 金山视频云,2017-11-14,《HEIF格式解析》。
  • CSDN-打怪升级ing,2018-11-29,《H.264和H.265(HEVC)深度解析及对比》。


    关注 IT之家


微信扫一扫关注公众号

0 个评论

要回复文章请先登录注册