使用 pdflatex 快速嵌入 PNG

使用 pdflatex 快速嵌入 PNG

我有一个 LaTeX 文档,其中包含很多 PNG 图像。编译大约需要 18 秒。大部分时间都花在了包含 PNG 图像上。ctan 的 pdfTeX 1.40 手册第 40 页指出,在 pdfTeX 运行期间,PNG 通常会被重新压缩,但在某些情况下,也可以直接复制,这样速度会快得多。根据手册,在这种情况下,字符串“PNG copy”会写入控制台日志。

我尝试了许多不同的 PNG 文件,直到找到一个可以提供所需输出的文件。

我的最小例子只是

\documentclass{article}
\usepackage{graphicx}
\begin{document}
    \includegraphics{test.png}
\end{document}

使用这个图片test.png生成“PNG 副本”,而这个图片(就像我的所有 PNG 图像一样)则不然。

有人知道,实现快速直接复制需要对 PNG 文件有哪些要求吗?

答案1

Hartmut Henkel 陈述了这些条件在上下文邮件列表的邮件中

  • 非隔行扫描
  • 没有调色板
  • 没有透明度
  • 没有伽马
  • 未请求伽马修改
  • PNG 中没有白色调整
  • 以及其他一些稀有物种。

他还表示:

这些是关于影响 PNG 到 PDF 大小的因素。对于大型 PNG 图形,您可能会发现预处理(例如pngtopnm| pnmtopng)肯定会去除所有脂肪)使其符合PNG 副本

答案2

免责声明:我会尝试写一篇技术性解释来解释我的发现,但我对这些图像巫术并不精通。请耐心等待。:)

这只是部分答案。我不知道这种格式在处理时会产生什么影响pdfTeX编辑:参见帕特里克的回答。

为了让我们的生活更轻松,我将图像命名:

  • “正常”的一个:subject1.png
  • “PNG 复制”:subject2.png

这些图像与提供的图像类似。您的输出可能有所不同。

感谢图像魔术师工具,我找到了一些关于这里可能发生的事情的线索。

> identify subject1.png
subject1.png PNG 672x656 672x656+0+0 8-bit DirectClass 38.2KB 0.000u 0:00.000

> identify subject2.png
subject2.png PNG 672x656 672x656+0+0 8-bit PseudoClass 16c 23.7KB 0.000u 0:00.000

主要的区别似乎在于class两幅图像的清晰度。由于我不熟悉这个主题,所以ImageMagick 页面可能有助于理解发生了什么:

接下来是二进制图像数据本身。图像数据的格式取决于标头中 class 键的值指定(或未指定)的图像类别。

  • DirectClass 图像是连续色调图像,存储为 RGB(红色、绿色、蓝色)、RGBA(红色、绿色、蓝色、alpha)、CMYK(青色、黄色、洋红色、黑色)或 CMYKA(青色、黄色、洋红色、黑色、alpha)强度值,由颜色空间键定义。深度为 8(0..255)的图像的每个强度值长度为 1 个字节,深度为 16(0..65535)的图像为 2 个字节,深度为 32(0..4294967295)的图像需要按最高有效字节优先顺序占用 4 个字节。

  • PseudoClass 图像是颜色映射的 RGB 图像。颜色映射存储为一系列红色、绿色和蓝色像素值,每个值的大小为一个字节。如果图像深度为 16,则每个颜色映射条目占用两个字节,最高有效字节在前。颜色映射条目的数量由 colors 键定义。颜色映射数据紧跟在标题之后(如果 montage 键在标题中,则紧跟在图像目录之后)。PseudoClass 图像数据是颜色映射中的索引值数组。如果图像中有 256 种或更少的颜色,则图像数据的每个字节都包含一个索引值。如果图像包含超过 256 种颜色或图像深度为 16,则索引值存储为两个连续的字节,最高有效字节在前。如果 matte 为真,则每个颜色映射索引后面跟着一个 1 或 2 个字节的 alpha 值。

通过运行

convert -type Palette subject1.png subject3.png

该班级从DirectClass改为PseudoClass

.tex现在,使用运行示例\includegraphics{subject3.png}log文件现在告诉我:

subject3.png (PNG copy)

至少,现在图像的处理方式不同了。:)

相关内容