页面利用渐进式JPEG来提升用户体验度


Posted in PHP onDecember 01, 2014

今天才认识到原来JPEG文件有两种保存方式他们分别是Baseline JPEG(标准型)和Progressive JPEG(渐进式)。两种格式有相同尺寸以及图像数据,他们的扩展名也是相同的,唯一的区别是二者显示的方式不同。

Baseline JPEG

这种类型的JPEG文件存储方式是按从上到下的扫描方式,把每一行顺序的保存在JPEG文件中。打开这个文件显示它的内容时,数据将按照存储时的顺序从上到下一行一行的被显示出来,直到所有的数据都被读完,就完成了整张图片的显示。如果文件较大或者网络下载速度较慢,那么就会看到图片被一行行加载的效果,这种格式的JPEG没有什么优点,因此,一般都推荐使用Progressive JPEG。

页面利用渐进式JPEG来提升用户体验度

Progressive JPEG

和Baseline一遍扫描不同,Progressive JPEG文件包含多次扫描,这些扫描顺寻的存储在JPEG文件中。打开文件过程中,会先显示整个图片的模糊轮廓,随着扫描次数的增加,图片变得越来越清晰。这种格式的主要优点是在网络较慢的情况下,可以看到图片的轮廓知道正在加载的图片大概是什么。在一些网站打开较大图片时,你就会注意到这种技术。

页面利用渐进式JPEG来提升用户体验度

渐进式图片带来的好处是可以让用户在没有下载完图片就可以看到最终图像的大致轮廓,一定程度上可以提升用户体验。(瀑布留的网站建议还是使用标准型的)

页面利用渐进式JPEG来提升用户体验度

另外渐进式的图片的大小并不会和基本的图片大小相差很多,有时候可能会比基本图片更小。渐进式的图片的缺点就是吃用户的CPU和内存,不过对于现在的电脑来说这点图片的计算并不算什么。

说了这边多下面就改讲讲怎么讲图片保存为或者转化为Progressive JPEG了。

1、PhotoShop

在photoshop中有“存储为web所用格式”,打开后选择“连续”就是渐进式JPEG。

页面利用渐进式JPEG来提升用户体验度 

具体教程参考 https://3water.com/photoshop/182198.html

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

使用 imageinterlace 和 imagejpeg 函数我们可以轻松解决转换问题。

<?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);
}

以上就是使用渐进式JPEG图片来提升页面体验度的全部内容了,很简单实用,这里推荐给小伙伴们。

PHP 相关文章推荐
复杂检索数据并分页显示的处理方法
Oct 09 PHP
PHP面向接口编程 耦合设计模式 简单范例
Mar 23 PHP
php数据结构与算法(PHP描述) 快速排序 quick sort
Jun 21 PHP
浅析PHP中Collection 类的设计
Jun 21 PHP
php时区转换转换函数
Jan 07 PHP
PHP 登录完成后如何跳转上一访问页面
Jan 14 PHP
PHP保存带BOM文件的方法
Feb 12 PHP
浅谈php错误提示及查错方法
Jul 14 PHP
PHP的中使用非缓冲模式查询数据库的方法
Feb 05 PHP
windows下的WAMP环境搭建图文教程(推荐)
Jul 27 PHP
PHP学习记录之数组函数
Jun 01 PHP
解决Laravel使用验证时跳转到首页的问题
Nov 17 PHP
php页面函数设置超时限制的方法
Dec 01 #PHP
PHP实现抓取HTTPS内容
Dec 01 #PHP
php设置静态内容缓存时间的方法
Dec 01 #PHP
thinkphp实现发送邮件密码找回功能实例
Dec 01 #PHP
PHP清除字符串中所有无用标签的方法
Dec 01 #PHP
php防止网站被刷新的方法汇总
Dec 01 #PHP
phpstorm编辑器乱码问题解决
Dec 01 #PHP
You might like
PHP中全面阻止SQL注入式攻击分析小结
2012/01/30 PHP
如何在Ubuntu下启动Apache的Rewrite功能
2013/07/05 PHP
网页里控制图片大小的相关代码
2006/06/25 Javascript
IE下js调试工具Companion.JS
2010/10/15 Javascript
js创建子窗口并且回传值示例代码
2013/07/02 Javascript
关于jQuery判断元素是否存在的问题示例探讨
2014/07/21 Javascript
Enter回车切换输入焦点实现思路与代码兼容各大浏览器
2014/09/01 Javascript
Javascript中replace()小结
2015/09/30 Javascript
JS实现的网页背景闪电闪烁效果代码
2015/10/17 Javascript
分享12个非常实用的JavaScript小技巧
2016/05/11 Javascript
JS判断字符串变量是否含有某个字串的实现方法
2016/06/03 Javascript
javascript之Boolean类型对象
2016/06/07 Javascript
AngularJS实现表单验证功能
2017/01/09 Javascript
setTimeout函数的神奇使用
2017/02/26 Javascript
JavaScript两个变量交换值的实现方法
2017/03/01 Javascript
Mac系统下Webstorm快捷键整理大全
2017/05/28 Javascript
Javascript 严格模式use strict详解
2017/09/16 Javascript
vue+php实现的微博留言功能示例
2019/03/16 Javascript
JavaScript展开操作符(Spread operator)详解
2019/07/20 Javascript
JavaScript中使用Spread运算符的八种方法总结
2020/06/18 Javascript
微信小程序实现翻牌抽奖动画
2020/09/21 Javascript
[44:47]Ti4 循环赛第三日 iG vs NaVi
2014/07/12 DOTA
python实现字典(dict)和字符串(string)的相互转换方法
2017/03/01 Python
python安装numpy&amp;安装matplotlib&amp; scipy的教程
2017/11/02 Python
Python自定义线程类简单示例
2018/03/23 Python
Window10+Python3.5安装opencv的教程推荐
2018/04/02 Python
Python实现插入排序和选择排序的方法
2019/05/12 Python
python 进程间数据共享multiProcess.Manger实现解析
2019/09/23 Python
python 用户交互输入input的4种用法详解
2019/09/24 Python
python的链表基础知识点
2020/09/13 Python
html5中监听canvas内部元素点击事件的三种方法
2019/04/28 HTML / CSS
定义一结构体变量,用其表示点坐标,并输入两点坐标,求两点之间的距离
2015/08/17 面试题
超市重阳节活动方案
2014/02/10 职场文书
2015出纳试用期工作总结
2014/12/12 职场文书
杭州西湖英语导游词
2015/02/03 职场文书
党支部工作总结2015
2015/04/01 职场文书