(圖片來自網絡)javascript
(圖片來自網絡)php
(圖片來自網絡)java
(圖片來自網絡)python
//ImageHeaderParser.java
private static final int EXIF_MAGIC_NUMBER = 0xFFD8;
// JPEG.
if (firstTwoBytes == EXIF_MAGIC_NUMBER) {
return JPEG;
}複製代碼
FFD8 ... FFDA ... FFDA ... FFDA ... FFD9複製代碼
(圖片來自Wiki)
en.wikipedia.org/wiki/JPEGlinux
(如下轉換方法來自網絡,因爲非java代碼,因此沒有作驗證,特此說明一下)web
在photoshop中有「存儲爲web所用格式」,打開後選擇「連續」就是漸進式JPEG。 瀏覽器
檢測是否爲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緩存
使用imageinterlace和imagejpeg函數咱們能夠輕鬆解決轉換問題。網絡
<?php
$im = imagecreatefromjpeg('pic.jpg');
imageinterlace($im, 1);
imagejpeg($im, './php_interlaced.jpg', 100);
imagedestroy($im);
?>複製代碼
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)複製代碼
jpegtran -copy none -progressive <inputfile> <outputfile>複製代碼
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圖片,而後根據每一幀的節點來判斷並決定是否須要加載)數據結構
(Progressive JPEG的圖一打水印就變成Baseline JPEG,應該是CSDN打水印保存的時候處理了)
須要看圖片二進制結構的,能夠下載一些工具(如hex-editor-neo)
hex-editor-neo下載
在後面的文章裏面咱們將具體講解如何在app端作漸進式加載