哈喽,大家好呀,我是前端理想哥,今天理想哥想和大家聊一聊关于图片不开启Gzip压缩的原因
。
很多朋友可能会发现,对于JS、CSS、HTML这些文件来说,当你开启Gzip压缩之后往往都会压缩到原有体积的三分之一,但是呢,对于图片开启Gzip压缩之后,体积基本没有啥变化,这是为什么呢?很多文章在讲这个问题的时候只会讲结果,今天理想哥想从Gzip压缩的原理层面把这个问题给大家讲透。
要讲明白这个问题,我们得需要先来了解一下Gzip压缩的底层算法。
Gzip是使用deflate算法
进行压缩的,deflate算法
会先使用LZ77算法
对文件压缩,然后会使用Huffman编码
再次压缩,最终会得到压缩后的文件,重复度越高的文件可压缩的空间就会越大。
那么LZ77算法
和Huffman编码
是什么?在这里理想哥只简单介绍一下这两种算法的大致原理,感兴趣的同学可以下去之后再详细了解一下。
LZ77算法
大家可以理解为正则中的贪婪算法,原理是什么呢?
如果文件中有两块相同的内容,我们就可以使用两块相同内容之间的距离和长度来替换后一块内容,这样文件的整个体积就可以变小了。
举个例子,比如我们现在有一段字符串
ABCDEFABCD
大家可以看到这段字符串中ABCD是重复的,那么使用LZ77算法
我们就可以把这段字符串表达为
ABCDEF(7,4)
7是代表从第7位开始重复,4是代表重复ABCD4个字符,这样就可以减少总的字符数了。
那么Huffman编码
是什么呢?Huffman编码
是使用一种特别的方法为信号源中的每个符号设定一个二进制码,出现频率更大的符号会获得更短的比特,出现频率更小的符号会被分配更长的比特,以此来提高数据的压缩率,提高传输效率。
比如,通过Huffman编码
我们就可以将ABAABACD
这个字符串使用二进制编码 01000100110111
来表示,字符的长度会得到明显的缩短。
说完这两种算法,我们再回到原题为什么图片不开启Gzip压缩呢?
原因是,我们常见的主流图片格式Jpg、Png、Gif等,其实已经用过压缩算法了,当你开启Gzip压缩再次进行压缩非但不会减少体积还可能因为增加了文件头尾信息部分导致总体积反而变大了。最终会导致增加了网站响应时间和浪费CPU计算,而且当大家有兴趣去了解Png图片的压缩算法时,你会发现Png也是使用的deflate算法
,所以没有必要用Gzip的deflate算法
进行再次压缩。
以上就是理想哥关于这个问题的回答,如果大家对文章感兴趣,欢迎给理想哥一个一键关注,万分感谢大家。