如何强制 pdfTeX 和 XeTeX 对导入的图像产生相同的测量值?

如何强制 pdfTeX 和 XeTeX 对导入的图像产生相同的测量值?

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 分辨率字段为空。似乎pdflatexxelatex在此设置下的行为不同。

  • pdflatex要么始终忽略 Exif 数据,要么在 Exif 数据不完整时返回 JFIF 数据。因此,它成功地从文件中读取了分辨率信息并应用了它。(我猜 Taco 的解决方案只尝试设置默认分辨率,因此被从文件中成功读取的分辨率所覆盖。)
  • xelatex看到 Exif 元数据,因此尝试从中读取。但由于其中没有分辨率信息,它会恢复到其默认分辨率 72ppi。似乎当存在一些 Exif 数据时,会xelatex忽略整个 JFIF 块(我不知道这是功能还是错误)。当 Exif 数据被完全删除(例如通过exiv2 rm Koala.jpg)时,它会读取 JFIF 元数据并正确应用存储在那里的分辨率。

答案2

看起来图像没有任何实际的分辨率信息,并且 xetex 和 pdftex 使用不同的默认值。

详细说明:我认为情况确实如此,因为 pdftex 似乎使用的是 96dpi,这与其对像素分辨率的理解相符。因此,我预计标识报告的 72dpi 实际上并不在 jpg 文件中,而只是它使用的默认值。

相关内容