(图片来自网络)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端作渐进式加载