Imagick、Photoshop与Windows分辨率检测差异:原因探究(PPI/PPCM)
图像文件格式的DPI存储机制差异解析
场景与问题
我目前在大量处理JPG、PNG、Tiff格式图像的分辨率检测工作,使用Imagick的以下代码获取分辨率及单位:
$imagick = new Imagick($filename); $data = $imagick->identifyimage(); var_dump($data);
过程中发现不同工具对DPI的处理存在明显差异:
- Windows 11仅能在JPG属性中查看分辨率,PNG无此选项;且无论PSD设置的单位是PixelsPerCentimeter还是PixelsPerInch,均显示为300 dpi
- Imagick 6.9.11-60 Q16 x86_64版本可区分不同单位保存的JPG,但无论Photoshop如何创建PNG,均返回PixelsPerCentimeter
- Photoshop 24.1.0版本可检测JPG的PixelsPerCentimeter,但所有PNG均显示为PixelsPerInch,即便保存时设置为PixelsPerCentimeter
- 用Imagick创建300dpi(PixelsPerInch)的PNG,Imagick返回的仍是118 PixelsPerCentimeter
我的疑问是:这些差异源于文件读取方式,还是不同文件类型的元数据存储机制?
解答
这些差异同时源于文件类型的元数据存储机制差异,以及不同工具的读取/解析逻辑差异,具体如下:
1. 文件格式的DPI存储规范差异
- JPG(JPEG):在JFIF或EXIF元数据块中存储分辨率信息,支持明确指定单位(每英寸像素/每厘米像素),工具可直接读取原始单位标识。
- PNG:分辨率信息存储在
pHYschunk中,该块仅存储像素密度数值和单位标识(0=无单位,1=每米像素,2=每英寸像素)。但不少工具会默认将PNG分辨率转换为每厘米像素返回,或写入时自动转换单位,导致读取时单位显示不一致。 - PSD:内部分辨率元数据存储逻辑偏向自身处理,Windows属性面板读取时会统一转换为dpi显示,忽略原始单位设置。
2. 工具的读取/解析逻辑差异
- Windows 11属性面板:对PNG的
pHYschunk支持不完善,未读取其分辨率信息;对PSD则统一转换单位,仅显示dpi数值。 - Imagick:部分版本处理PNG时,会自动将每英寸像素转换为每厘米像素返回,即便原始存储的是英寸单位。
- Photoshop:处理PNG时会统一将读取到的分辨率转换为每英寸像素显示,这是其UI显示逻辑决定的,与原始存储单位无关。
简言之,文件格式的存储规范是基础,不同工具为适配自身场景,会对元数据做不同的单位转换或显示处理,最终导致了你遇到的差异。
内容的提问来源于stack exchange,提问作者UrbanwarfareStudios
相关产品推荐
相关产品推荐

