![如何强制 pdfTeX 和 XeTeX 对导入的图像产生相同的测量值?](https://linux22.com/image/239441/%E5%A6%82%E4%BD%95%E5%BC%BA%E5%88%B6%20pdfTeX%20%E5%92%8C%20XeTeX%20%E5%AF%B9%E5%AF%BC%E5%85%A5%E7%9A%84%E5%9B%BE%E5%83%8F%E4%BA%A7%E7%94%9F%E7%9B%B8%E5%90%8C%E7%9A%84%E6%B5%8B%E9%87%8F%E5%80%BC%EF%BC%9F.png)
resolution
在 XeTeX 中未定义,因此以下代码在使用 pdfTeX 和 XeTeX 编译时将产生不同的值。
\documentclass{article}
\usepackage{graphicx}
\newsavebox\IBox
\savebox\IBox{\includegraphics[scale=1]{koala.jpg}}
\begin{document}
\the\wd\IBox
\end{document}
如何强制 pdfTeX 和 XeTeX 对导入的图像产生相同的测量值?
答案1
tl;dr 版本:Koala 文件中的元数据不确定,因为 Exif 标头存在,但未指定分辨率。要解决此问题,请使用某些工具将分辨率添加到 Exif 数据或完全删除 Exif 数据。
首先介绍一下(现代)jpg 图像元数据的存储技术细节(我不是这方面的专家,因此以下内容可能不完全正确):元数据有两种格式,称为 JFIF(JPEG 文件交换格式)和 EXIF(可交换图像文件格式)。第一种格式是为了解决原始 JPEG 文件格式(JIF)的一些缺陷而创建的,第二种格式是为了添加来自相机的元数据。两者都可以存在于同一个文件中(通常是这样)。两者都有一个字段来设置图像的分辨率。请注意,原始 JPEG 文件格式(JIF)无法存储分辨率。
Windows 自带的图像Koala.jpg
包含这两种元数据(尽管大多数 Exif 字段都未使用)。但是,它只将分辨率存储在 JFIF 元数据中,而 Exif 分辨率字段为空。似乎pdflatex
和xelatex
在此设置下的行为不同。
pdflatex
要么始终忽略 Exif 数据,要么在 Exif 数据不完整时返回 JFIF 数据。因此,它成功地从文件中读取了分辨率信息并应用了它。(我猜 Taco 的解决方案只尝试设置默认分辨率,因此被从文件中成功读取的分辨率所覆盖。)xelatex
看到 Exif 元数据,因此尝试从中读取。但由于其中没有分辨率信息,它会恢复到其默认分辨率 72ppi。似乎当存在一些 Exif 数据时,会xelatex
忽略整个 JFIF 块(我不知道这是功能还是错误)。当 Exif 数据被完全删除(例如通过exiv2 rm Koala.jpg
)时,它会读取 JFIF 元数据并正确应用存储在那里的分辨率。
答案2
看起来图像没有任何实际的分辨率信息,并且 xetex 和 pdftex 使用不同的默认值。
详细说明:我认为情况确实如此,因为 pdftex 似乎使用的是 96dpi,这与其对像素分辨率的理解相符。因此,我预计标识报告的 72dpi 实际上并不在 jpg 文件中,而只是它使用的默认值。