使用渐进式JPG改善用户体验

时间:2021-06-01 21:23:33

问题如此:当一张JPG压缩到无法压缩的程度,但是它的大小还有有点大,你会怎么做?

      当时听到这个问题觉得一头雾水,根本不知道如何回答,后来面试官问我有没有听过一种叫做渐进式的JPG格式?我很坦白的说没有,后来得知原来这是一种我们WEB中

常见的JPG编码类型之一,使用这种格式的JPG我们发现图片在网页加载时会经历从模糊到清晰这个过程。可能这样表述不清晰,下文会以图片对比。

      使用渐进式JPG改善用户体验

       上图一:

              图一中我们可以发现图片是从上倒下一条一条逐渐加载的,这种JPG压缩模式叫做顺序式编码(Sequential Encoding),一次将图像由左到右、由上到下顺序

处理。也是一种常见的JPG编码模式。

       上图二:

              图二中我们可以发现同样是一样图片,因为图片较大图一要逐渐加载完我们才知道这张图片的大致轮廓,但是在图二上,由于使用了渐进式JPG格式,在图片加载

的时候我们已经可以看到了图片的大致轮廓,这种就是渐进式JPG,使用了递增式编码(Progressive Encoding)

       所以?

             1.所谓的渐进式JPG格式就是采用了递增式编码的JPG,你可以通过谷歌搜索关键字JPG Progressive Encoding查的更多英文的资料,因为我发现国内这方面的介绍

不是很多。

              2.这种JPG格式是当图像传输的时间较长时,可将图像分数次处理,以从模糊到清晰的方式来传送图像(效果类似GIF在网络上的传输)。

              所以你可能还是不知道我在讲什么。

        于是再次放出例子:

              在QQ空间看相册的人会发现画廊显示的图片一开始会非常非常的模糊,后来才逐渐地清晰起来,其实这就是渐进式的显示效果。我从自己的QQ空间掏了一张图片给

大家看看

      使用渐进式JPG改善用户体验

     整张图片都采用了渐进式的图片编码格式,一开始我们浏览器加载图片的时候效果如图一,直到整片文章加载完毕之后效果如图二。SO~?讲了这么多还是教大家如何将图片

导出成渐进式JPG吧。

       如何实现渐进式JPG格式?方法一:使用Photoshop导出

      使用渐进式JPG改善用户体验

      步骤一:

          在PS菜单栏选择“文件”-》存储为WEB和设备所用格式

      使用渐进式JPG改善用户体验

       步骤二:

           选择图片格式为JPG0-》选中“连续”(经验不多,欢迎纠误。)-》“存储”即可

       方法二:

           没有PS或者想用别的快捷工具的可以使用工具“PaintShopPro”

      步骤:

           打开软件PaintShopPro-》打开图片-》点击菜单”FILE”-》选择”Save as”-》保存类型选择”JPG”-》Sub Type选择”Progressive Encoding”即可

           使用渐进式JPG改善用户体验

其他方法:

2、Linux

检测是否为progressive jpeg : identify -verbose filename.jpg | grep Interlace(如果输出 None 说明不是progressive jpeg;如果输出 Plane 说明是 progressive jpeg。)

将basic jpeg转换成progressive jpeg:> convert infile.jpg -interlace Plane outfile.jpg

3、PHP

使用imageinterlaceimagejpeg函数我们可以轻松解决转换问题

<?php
$im = imagecreatefromjpeg(‘pic.jpg’);
imageinterlace($im, 1);
imagejpeg($im, ‘./php_interlaced.jpg’, 100);
imagedestroy($im);
?>
4、Python

import PIL
from exceptions import IOError

img = PIL.Image.open(“c:\\users\\biaodianfu\\pictures\\in.jpg”)
destination = “c:\\users\\biaodianfu\\pictures\\test.jpeg”
try:
img.save(destination, “JPEG”, quality=80, optimize=True, progressive=True)
except IOError:
PIL.ImageFile.MAXBLOCK = img.size[0] * img.size[1]
img.save(destination, “JPEG”, quality=80, optimize=True, progressive=True)
5、 jpegtran

jpegtran -copy none -progressive <inputfile> <outputfile>

6、C#

using (Image source = Image.FromFile(@”D:\temp\test2.jpg”)) {
ImageCodecInfo codec = ImageCodecInfo.GetImageEncoders().First(c => c.MimeType == “image/jpeg”);
EncoderParameters parameters = new EncoderParameters(3);
parameters.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 100L);
parameters.Param[1] = new EncoderParameter(System.Drawing.Imaging.Encoder.ScanMethod, (int)EncoderValue.ScanMethodInterlaced);
parameters.Param[2] = new EncoderParameter(System.Drawing.Imaging.Encoder.RenderMethod, (int)EncoderValue.RenderProgressive);
source.Save(@”D:\temp\saved.jpg”, codec, parameters);
}