
我的毕设里有一个摄影社的作品展示页首页一排都是两三千像素宽的大图。宿舍网慢的时候图是从上往下一截一截露出来的。学长看了一眼说换成渐进式 JPEG 会好一点它会先出一张糊的全图再慢慢变清楚。动手之前我想先弄明白手上这些图本来是哪一种。可系统自带的图片预览和文件属性里都没写。社团的照片不方便拿出来写文章我就从 Wikimedia Commons 下了三张照片来练手。一张风景、一张小狗、一张白底的绿植枝条。风景那张缩到 2736×1824 以后我用 Pillow 11.3 按质量 85 存了一份基线式和一份渐进式当作对照。机器是一台装着 macOS 26.5.2 的 Apple M4 / 16 GB 的 Mac。下面三种查法都是在这几份文件上试出来的。我先试的是终端里系统自带的file命令。跑file 图片.jpg会打出一长行信息中间就写着 baseline 或者 progressive。两份对照文件它都说对了。macOS 和常见的 Linux 发行版都自带这个命令。Windows 上我没试过。我顺手也试了 macOS 自带的sips -g all。它能列出宽高、色彩空间和 DPI唯独没有跟渐进式有关的字段。想多看一点就用 libjpeg-turbo 带的djpeg。加上-verbose参数再把输出扔进/dev/null它就会把文件里的标记一个个打出来。先看 Start Of Frame 那一行后面的编号0xc0 是基线式0xc2 是渐进式。再数 Start Of Scan 出现了几次。基线式只有 1 次我那份渐进式有 10 次。这个数把「渐进」两个字说得很直白。基线式把整张图从上到下存一遍渐进式把同一张图拆成 10 遍来存先存粗的再一遍遍补细节。学长说的先糊后清就是这么来的。写 Python 的话 Pillow 也能直接查。我唯一的坑就踩在这里。打开图片以后看info里的 progressive 这一项渐进式返回 1。我第一次写判断用的是「等于 False 就是基线式」跑完发现基线式那份没判出来。打印出来一看它返回的是 None。基线式的info里根本就没存这个键。取不到值就是 None拿它跟 False 比永远不相等。这个坑不报错也不崩基线式的图只是被悄悄漏过去了。批量查几十张的时候尤其难发现我是因为对照文件的结果对不上才回头去看的。后来我改成只有取到值才算渐进式取不到一律按基线式算。三种方法试完我把下的三张照片逐张过了一遍。结果出乎我意料。风景和小狗都是 baseline。那张绿植枝条的照片file报的是 progressive。djpeg数出来它也是 10 次 Start Of ScanPillow 也返回 1。file那一长行里还带着 EXIF 的软件字段写的是 GIMP 2.8.2。我猜是拍的人用 GIMP 修完图存的时候选了渐进式。这只是猜测没法去问本人。之前我一直以为网上随手下的图都是基线式。这回才知道得一张张查。我在 Chromium 149 开源构建里用 canvas 的toBlob导出的 JPEG 是基线式。之前转海报和通知模板时导出的两份 JPG 我也查了。那次我用的是图映 ImgInghttps://imging.cn/浏览器同样是 Chromium 149 开源构建。两份的帧头都是基线式的 FF C0。跟 toBlob 一样。我猜它导出 JPG 走的就是浏览器自带的编码。想要渐进式只能在服务端或者用专门的编码库另外转一遍。值不值得转我也顺便量了。同样的质量下风景照和一张网上找的稿定设计放假通知模板存成渐进式都小了 3.9% 到 6.3%。解码时间是基线式的 2.3 到 2.6 倍不过都只有几毫秒到二十几毫秒。至于网慢时浏览器里能早多少看到整张图这一段我没拍成。我试过限速截屏截到的画面总是在整张图下完之后才出来。我现在查一张 JPEG 是哪种会按这个顺序来手边有终端就先跑file看输出里是 baseline 还是 progressive想看它拆成几遍存就用djpeg -verbose数 Start Of Scan在 Python 里批量查就读 Pillow 的info取不到值按基线式算别拿它跟 False 比网上下的、别人修过的图也逐张查别默认都是基线式手上有从网上下的或者修图软件导出的照片的话先拿file看一眼再用自己的脚本对一遍。