页面利用渐进式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 相关文章推荐
十天学会php之第五天
Oct 09 PHP
php ckeditor上传图片文件名乱码解决方法
Nov 15 PHP
PHP中鲜为人知的10个函数
Feb 28 PHP
如何阻止网站被恶意反向代理访问(防网站镜像)
Mar 18 PHP
php实现图片转换成ASCII码的方法
Apr 03 PHP
实现WordPress主题侧边栏切换功能的PHP脚本详解
Dec 14 PHP
在WordPress中使用wp_count_posts函数来统计文章数量
Jan 05 PHP
Zend Framework+smarty用法实例详解
Mar 19 PHP
yii2超好用的日期组件和时间组件
May 05 PHP
注释PHP和html混合代码的小技巧(分享)
Nov 03 PHP
PHP基于DOM创建xml文档的方法示例
Feb 08 PHP
php 猴子摘桃的算法
Jun 20 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
虹吸壶煮咖啡26个注意事项
2021/03/03 冲泡冲煮
使用Smarty 获取当前日期时间和格式化日期时间的方法详解
2013/06/18 PHP
关于PHP语言构造器介绍
2013/07/08 PHP
Laravel中的chunk组块结果集处理与注意问题
2018/08/15 PHP
jQuery代码优化 遍历篇
2011/11/01 Javascript
jquery星级插件、支持页面中多次使用
2012/03/25 Javascript
在图片上显示左右箭头类似翻页的代码
2013/03/04 Javascript
JS数组的赋值介绍
2014/03/10 Javascript
jquery操作select方法汇总
2015/02/05 Javascript
javascript实现相同事件名称,不同命名空间的调用方法
2015/06/26 Javascript
JavaScript使ifram跨域相互访问及与PHP通信的实例
2016/03/03 Javascript
一波JavaScript日期判断脚本分享
2016/03/06 Javascript
jQuery实现的省市县三级联动菜单效果完整实例
2016/08/01 Javascript
移动端js图片查看器
2016/11/17 Javascript
canvas绘制表盘时钟
2017/01/23 Javascript
jQuery读取XML文件的方法示例
2017/02/03 Javascript
详解Nodejs之npm&amp;package.json
2017/06/15 NodeJs
实例详解JSON取值(key是中文或者数字)方式
2017/08/24 Javascript
vue.js中引入vuex储存接口数据及调用的详细流程
2017/12/14 Javascript
VUE 自定义组件模板的方法详解
2019/08/30 Javascript
JS防抖和节流实例解析
2019/09/24 Javascript
es6函数之尾递归用法实例分析
2020/04/25 Javascript
TensorFlow高效读取数据的方法示例
2018/02/06 Python
python实现嵌套列表平铺的两种方法
2018/11/08 Python
Python 实现取矩阵的部分列,保存为一个新的矩阵方法
2018/11/14 Python
pandas分别写入excel的不同sheet方法
2018/12/11 Python
python3转换code128条形码的方法
2019/04/17 Python
python pandas cumsum求累计次数的用法
2019/07/29 Python
python的flask框架难学吗
2020/07/31 Python
详解Python中如何将数据存储为json格式的文件
2020/11/18 Python
英国蛋糕装饰用品一站式商店:Craft Company
2019/03/18 全球购物
酒店个人求职信范文
2014/01/25 职场文书
食品质量与安全专业毕业生求职信
2014/08/11 职场文书
房地产财务经理岗位职责
2015/04/08 职场文书
毕业实习单位意见
2015/06/04 职场文书
创业计划书之熟食店
2019/10/16 职场文书