1

我现在正在使用 ImageMagickconvert实用程序。我有一个 PostScript 文件需要大约 90 秒才能转换为 GIF。

我正在寻找一种更快的方法来最好地通过修改“转换”选项来做到这一点。

当我说“快”时,最好是几秒钟,但我会采取任何显着的速度。适合交互式 GUI 的东西。

我只需要黑白或灰度的(特别是地震数据“摆动轨迹”的图像,所以黑白很好。)

其他可接受的格式包括 BMP、GIF、JPEG、JPG、PCX、PGM、PNG、PNM、PPM、RAS、TGA、TIF 或 TIFF。

试图坚持使用已经安装的 ImageMagick,并试图避免向我的老板出售任何新东西。仍然很高兴听到其他建议。

4

2 回答 2

4

我的建议是:使用 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上查找包含gsgsxgswin32c或的打印行):gswin64c

 convert -verbose some.pdf[0] some.gif

更新

我确实运行了一个非常非常不科学的“基准”,分别运行以下两个命令 100 次,将官方 PDF 规范(PDF-1.7 的 ISO 版本)的随机选择的第 333 页转换为 GIF,测量消耗的时间. 我同时并行运行这些命令,因此两者都必须处理相同的整体系统负载,从而使结果具有更好的可比性:

  1. 'Comfortably' 使用 ImageMagick'sconvert直接生成 GIF:

    time for i in $(seq -w 1 100); do
        convert                      \
           PDF32000_2008.pdf[333]    \
           p333-im-no_${i}.gif ;
    done
    
  2. 使用 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 秒)让我对我的猜测有足够的信心,当你遵循我的建议时,你可以获得显着的性能改进。:-)

于 2012-09-26T18:10:32.180 回答
1

我现在正在使用 ImageMagick 转换实用程序。我有一个 PostScript 文件需要大约 90 秒才能转换为 GIF。

我正在寻找一种更快的方法来最好地通过修改“转换”选项来做到这一点。

当我说“快”时,最好是几秒钟,但我会采取任何显着的速度。适合交互式 GUI 的东西。

我只需要黑白或灰度的(特别是地震数据“摆动轨迹”的图像,所以黑白很好。)

您可以从 GhostScript 开始:

 gs -dSAFER -dBATCH -dNOPAUSE \
    -sDEVICE=pnggray -r300 -sOutputFile=seismic.png seismic.pdf

一个更长但有趣的方法是准确分析这些PDF 中的内容。

我必须对 EKG 工作流程的 PDF 输出做类似的事情。原始数据不可用,我们只有 PDF,但我发现 PDF 是基于矢量而不是光栅。经过一番修改后,很容易解码标签、图例和构成 EKG 图的单个基本线,我想出了一个选项,从出现的灰度图像开始重新着色轨道。不过,这确实需要几天时间。

您的 PDF 可能以类似的方式生成,并且数据可以被解码(起初我不得不用它pdftk来获取非压缩的 PDF,然后我找到了一个可以使用的库 - 它实现了 Deflate 算法)。以 SVG 格式输出真的很酷 :-)

于 2012-09-26T21:18:08.607 回答