我的建议是:使用 Ghostscript。
由于您已经安装了工作的 ImageMagick,这意味着 Ghostscript 也在那里:因为 ImageMagick 无法自行将 PDF 或 PostScript 转换为光栅图像——它必须调用 Ghostscript 作为其代理才能执行此操作。
Ghostscript 可以直接将 PDF/PostScript 输入转换为 TIFF/TIF/TIFFg4、JPEG、PBM、PCX、PNG、PNM、PPM、BMP 光栅图像输出。
优点是:您不需要涉及 ImageMagick。所以它更快,也让您更直接地控制转换参数。如果您通过 ImageMagick 运行 Ghostscript,那是一个并不总是需要的间接级别。(有时可能需要为 Ghostscript 生成的光栅图像数据添加一些微调和后处理操作——但对您来说似乎并非如此。)
唯一的缺点是: Ghostscript 不能生成 GIF。如果您需要GIF(您似乎不需要),则需要 ImageMagick 将 Ghostscript 的光栅输出后处理为 GIF。
您可以通过运行以下示例查看 ImageMagick 如何调用 Ghostscript(以及它用于调用的参数 - 在stderr上查找包含gs
、gsx
或gswin32c
或的打印行):gswin64c
convert -verbose some.pdf[0] some.gif
更新
我确实运行了一个非常非常不科学的“基准”,分别运行以下两个命令 100 次,将官方 PDF 规范(PDF-1.7 的 ISO 版本)的随机选择的第 333 页转换为 GIF,测量消耗的时间. 我同时并行运行这些命令,因此两者都必须处理相同的整体系统负载,从而使结果具有更好的可比性:
'Comfortably' 使用 ImageMagick'sconvert
直接生成 GIF:
time for i in $(seq -w 1 100); do
convert \
PDF32000_2008.pdf[333] \
p333-im-no_${i}.gif ;
done
使用 Ghostscript 从同一页面创建灰度 PNG,将 Ghostscript 的输出传送到 ImageMagickconvert
以获得 GIF:
time for i in $(seq -w 1 100); do
gs \
-q \
-o - \
-dFirstPage=333 \
-dLastPage=333 \
-sDEVICE=pnggray \
PDF32000_2008.pdf \
| \
convert \
- \
p333-gs-no_${i}.gif ;
done
第一个命令的计时结果(运行“舒适”convert
以实现 PDF-> GIF 转换,它仅在“背后”使用 Ghostscript):
real 2m29.282s
user 2m22.526s
sys 0m5.647s
第二个命令的计时结果(gs
直接+公开运行,将其输出管道传输到convert
:
real 1m27.370s
user 1m23.447s
sys 0m3.435s
还有一件事:
100 个“Ghostscript”-GIF 的总大小为 1.6 MB——但它们是 8 位灰度的。
100 个“ImageMagic-direct”-GIF 的总大小为 1.2 MB——但它们是 2 位黑白。
我目前没有动机更多地调整测试命令行参数以使结果文件更具有可比性。
这个结果(149 秒对 87 秒)让我对我的猜测有足够的信心,当你遵循我的建议时,你可以获得显着的性能改进。:-)