页面利用渐进式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 相关文章推荐
分页显示Oracle数据库记录的类之二
Oct 09 PHP
关于时间计算的结总
Dec 06 PHP
PHP 数组入门教程小结
May 20 PHP
php xml常用函数的集合(比较详细)
Jun 06 PHP
PHP生成自适应大小的缩略图类及使用方法分享
May 06 PHP
php解决抢购秒杀抽奖等大流量并发入库导致的库存负数的问题
Jun 19 PHP
Yii2如何批量添加数据
May 17 PHP
php提交表单时保留多个空格及换行的文本样式的方法
Jun 20 PHP
实现PHP中session存储及删除变量
Oct 15 PHP
php xhprof使用实例详解
Apr 15 PHP
PHP+redis实现的限制抢购防止商品超发功能详解
Sep 19 PHP
PHP简单实现图片格式转换(jpg转png,gif转png等)
Oct 30 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中在数据库中保存Checkbox数据(2)
2006/10/09 PHP
php读取txt文件组成SQL并插入数据库的代码(原创自Zjmainstay)
2012/07/31 PHP
thinkphp中memcache的用法实例
2014/11/29 PHP
PHP程序员必须清楚的问题汇总
2014/12/18 PHP
PHP操作FTP类 (上传、下载、移动、创建等)
2016/03/31 PHP
Yii数据模型中rules类验证器用法分析
2016/07/15 PHP
用jQuery打造TabPanel效果代码
2010/05/22 Javascript
倒记时60刷新网页的js代码
2014/02/18 Javascript
JavaScript简单实现鼠标拖动选择功能
2014/03/06 Javascript
nodejs npm package.json中文文档
2014/09/04 NodeJs
jQuery 实现评论等级好评差评特效
2016/05/06 Javascript
微信小程序 开发经验整理
2017/02/15 Javascript
Angular动态添加、删除输入框并计算值实例代码
2017/03/29 Javascript
JavaScript全屏和退出全屏事件总结(附代码)
2017/08/17 Javascript
Vue2.0实现组件数据的双向绑定问题
2018/03/06 Javascript
vue 项目中使用Loading组件的示例代码
2018/08/31 Javascript
纯javascript实现选择框的全选与反选功能
2019/04/08 Javascript
vue以组件或者插件的形式实现throttle或者debounce
2019/05/22 Javascript
layui table 表格模板按钮的实例代码
2019/09/21 Javascript
mpvue微信小程序的接口请求fly全局拦截代码实例
2019/11/13 Javascript
Ubuntu 16.04 LTS中源码安装Python 3.6.0的方法教程
2016/12/27 Python
利用Anaconda完美解决Python 2与python 3的共存问题
2017/05/25 Python
Python pip替换为阿里源的方法步骤
2019/07/02 Python
python3 assert 断言的使用详解 (区别于python2)
2019/11/27 Python
python 自定义异常和主动抛出异常(raise)的操作
2020/12/11 Python
销售人员职业生涯规划范文
2014/03/01 职场文书
旺仔牛奶广告词
2014/03/20 职场文书
工作推荐信范文
2014/05/10 职场文书
节水口号标语
2014/06/19 职场文书
模具设计与制造专业求职信
2014/07/19 职场文书
党性教育心得体会
2014/09/03 职场文书
品质保证书格式
2015/02/28 职场文书
Redis Cluster 字段模糊匹配及删除
2021/05/27 Redis
浅谈Python数学建模之固定费用问题
2021/06/23 Python
磁贴还没死, 微软Win11可修改注册表找回Win10开始菜单
2021/11/21 数码科技
浅谈GO中的Channel以及死锁的造成
2022/03/18 Golang