![如何判断 JPEG 是否已保存为渐进式?](https://linux22.com/image/1476240/%E5%A6%82%E4%BD%95%E5%88%A4%E6%96%AD%20JPEG%20%E6%98%AF%E5%90%A6%E5%B7%B2%E4%BF%9D%E5%AD%98%E4%B8%BA%E6%B8%90%E8%BF%9B%E5%BC%8F%EF%BC%9F.png)
我收到了摄影师发来的一组照片,需要确认 JPEG 未保存为渐进式 JPEG。我有 Adobe Bridge 和 Photoshop — 我该如何检查?
答案1
一些简单的方法:
- 图像魔术师— 在命令行运行:
identify -verbose mystery.jpg | grep Interlace
输出将是“Interlace:JPEG”或“Interlace: None”。- Photoshop— 打开文件。选择
File -> Save for Web & Devices
。
如果是渐进式 jpeg,则将选中渐进式复选框。- 任何浏览器— 基线 jpeg 会从上到下加载,渐进式 jpeg 则会做其他事情。如果文件加载速度太快,您可能需要添加带宽限制。我在 Mac 上使用 ipfw。
程序化方法
查看检测渐进式 JPEG作者发布了一些人们开发的脚本的链接:
可以使用几个标识字节来识别文件。渐进式 DCT JPEG 可以通过字节“0xFF、0xC2”来识别。此外,渐进式 JPEG 图像通常包含多个扫描,因此您可以查找几个“扫描开始”匹配项(字节:“0xFF、0xDA”)。作者使用了一个简单的 Bash 命令来获得准确的结果:
>grep -c -P “xffxc2″ progressive1.jpg
>1
>grep -c -P “xffxc2″ progressive2.jpg
>1
>grep -c -P “xffxc2″ baseline1.jpg
>0
>grep -c -P “xffxc2″ baseline2.jpg
>0
>grep -c -P “xffxDA” progressive1.jpg
>6
>grep -c -P “xffxDA” progressive2.jpg
>12
该链接还包含许多其他有用的工具。
更新
情节越来越复杂(感谢用户 PussInBoots 提醒我深入挖掘)。问题是如何判断 JPEG 是否已保存作为进步人士。
“另存为”似乎具有灵活的含义。我试验后发现,在某些情况下,另存为逐行扫描仅意味着更改了元数据参数(隔行扫描),但文件实际上并未更改为包含逐行扫描。因此,文件包含单个图像,渲染软件被告知将其视为逐行扫描图像。
这些“虚假”渐进式文件在上述测试中的表现如下:
InageMagick: Interlace 参数读取为“JPEG”而不是“None”。
Photoshop: 我手头唯一可用的 Photoshop 版本是旧版本(7.0 版)。在“存储为 Web”对话框中,
Progressive
这些文件上的复选框已预先选中,但标准 JPEG 则未选中。浏览器: 我的系统和互联网连接速度太快,因此这个测试没有用。在正常情况下,一切都非常接近瞬时,无法可靠地区分任何差异。
识别字节: 这似乎是一个更可靠的指标。“伪造”的渐进式 JPEG 没有任何可识别的字节模式。
因此对于最初的问题,如果上述任何测试表明该文件是不是渐进式 JPEG,您可以相信它不是。但是,上述“简单方法”似乎无法可靠地区分真正的渐进式 JPEG 和“伪造”的 JPEG,因此您不能依赖它们来判断 JPEG是确实很先进。事实上,PussInBoots 在评论中报告说,Photoshop CS6 似乎有一个默认选项是“先进”,因此它的初始设置不会告诉您有关现有文件的任何信息。
答案2
如果你使用的是 unix,请使用以下file
命令:
$ file image.jpg
image.jpg: JPEG image data, Exif standard: [TIFF image data, little-endian, direntries=0], progressive, precision 8, 2000x1200, components 3