頁面利用漸進(jìn)式JPEG來提升用戶體驗(yàn)度
今天才認(rèn)識(shí)到原來JPEG文件有兩種保存方式他們分別是Baseline JPEG(標(biāo)準(zhǔn)型)和Progressive JPEG(漸進(jìn)式)。兩種格式有相同尺寸以及圖像數(shù)據(jù),他們的擴(kuò)展名也是相同的,唯一的區(qū)別是二者顯示的方式不同。
Baseline JPEG
這種類型的JPEG文件存儲(chǔ)方式是按從上到下的掃描方式,把每一行順序的保存在JPEG文件中。打開這個(gè)文件顯示它的內(nèi)容時(shí),數(shù)據(jù)將按照存儲(chǔ)時(shí)的順序從上到下一行一行的被顯示出來,直到所有的數(shù)據(jù)都被讀完,就完成了整張圖片的顯示。如果文件較大或者網(wǎng)絡(luò)下載速度較慢,那么就會(huì)看到圖片被一行行加載的效果,這種格式的JPEG沒有什么優(yōu)點(diǎn),因此,一般都推薦使用Progressive JPEG。
Progressive JPEG
和Baseline一遍掃描不同,Progressive JPEG文件包含多次掃描,這些掃描順尋的存儲(chǔ)在JPEG文件中。打開文件過程中,會(huì)先顯示整個(gè)圖片的模糊輪廓,隨著掃描次數(shù)的增加,圖片變得越來越清晰。這種格式的主要優(yōu)點(diǎn)是在網(wǎng)絡(luò)較慢的情況下,可以看到圖片的輪廓知道正在加載的圖片大概是什么。在一些網(wǎng)站打開較大圖片時(shí),你就會(huì)注意到這種技術(shù)。
漸進(jìn)式圖片帶來的好處是可以讓用戶在沒有下載完圖片就可以看到最終圖像的大致輪廓,一定程度上可以提升用戶體驗(yàn)。(瀑布留的網(wǎng)站建議還是使用標(biāo)準(zhǔn)型的)
另外漸進(jìn)式的圖片的大小并不會(huì)和基本的圖片大小相差很多,有時(shí)候可能會(huì)比基本圖片更小。漸進(jìn)式的圖片的缺點(diǎn)就是吃用戶的CPU和內(nèi)存,不過對(duì)于現(xiàn)在的電腦來說這點(diǎn)圖片的計(jì)算并不算什么。
說了這邊多下面就改講講怎么講圖片保存為或者轉(zhuǎn)化為Progressive JPEG了。
1、PhotoShop
在photoshop中有“存儲(chǔ)為web所用格式”,打開后選擇“連續(xù)”就是漸進(jìn)式JPEG。
具體教程參考 http://www.dbjr.com.cn/photoshop/182198.html
2、Linux
檢測(cè)是否為progressive jpeg : identify -verbose filename.jpg | grep Interlace(如果輸出 None 說明不是progressive jpeg;如果輸出 Plane 說明是 progressive jpeg。)
將basic jpeg轉(zhuǎn)換成progressive jpeg:> convert infile.jpg -interlace Plane outfile.jpg
3、PHP
使用 imageinterlace 和 imagejpeg 函數(shù)我們可以輕松解決轉(zhuǎn)換問題。
<?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);
}
以上就是使用漸進(jìn)式JPEG圖片來提升頁面體驗(yàn)度的全部?jī)?nèi)容了,很簡(jiǎn)單實(shí)用,這里推薦給小伙伴們。
相關(guān)文章
PHP+AjaxForm異步帶進(jìn)度條上傳文件實(shí)例代碼
在使用ajaxForm方法之前,首先需要安裝form.js的插件,網(wǎng)上可以找到,下面通過本文重點(diǎn)給大家介紹PHP+AjaxForm異步帶進(jìn)度條上傳文件實(shí)例代碼,感興趣的朋友一起看看吧2017-08-08tp5框架前臺(tái)無限極導(dǎo)航菜單類實(shí)現(xiàn)方法分析
這篇文章主要介紹了tp5框架前臺(tái)無限極導(dǎo)航菜單類實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了tp5框架前臺(tái)無限極導(dǎo)航菜單類實(shí)現(xiàn)原理、步驟與操作注意事項(xiàng),需要的朋友可以參考下2020-03-03ThinkPHP框架中使用Memcached緩存數(shù)據(jù)的方法
這篇文章主要介紹了ThinkPHP框架中使用Memcached緩存數(shù)據(jù)的方法,結(jié)合實(shí)例形式分析了thinkPHP框架中Memcached緩存的設(shè)置與使用相關(guān)操作技巧,需要的朋友可以參考下2018-03-03laravel框架中間件 except 和 only 的用法示例
這篇文章主要介紹了laravel框架中間件 except 和 only 的用法,簡(jiǎn)單說明了中間件 except 和 only的功能,并結(jié)合實(shí)例形式分析了laravel框架中間件 except 和 only 相關(guān)使用技巧,需要的朋友可以參考下2019-07-07