【问题标题】:What is the fastest way to convert PostScript to GIF?将 PostScript 转换为 GIF 的最快方法是什么?
【发布时间】:2012-09-26 17:47:27
【问题描述】:

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

我正在寻找一种更快的方法来执行此操作,最好将选项修改为“转换”。

当我说“快”时,最好是几秒钟,但我会大幅加快速度。适合交互式 GUI 的东西。

我只需要黑白或灰度的(具体来说,它是地震数据“摆动轨迹”的图像,所以黑白就可以了。)

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

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

【问题讨论】:

  • 90 秒似乎太多了。图片有多大? postscript 程序有多复杂?
  • 您能否提供(链接到)您正在处理的示例 PostScript 文件?
  • 交互式图形用户界面?听起来有点像Display PostScript 的目标。

标签: imagemagick postscript


【解决方案1】:

我的建议是:使用 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 或 @987654325 的打印行@) 通过运行例如:

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

更新

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

  1. 使用ImageMagick的convert直接生成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 的输出传送到 ImageMagick 的 convert 以获得 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 秒)让我对我的猜测有足够的信心,即当您遵循我的建议时,您可以获得显着的性能改进。 :-)

【讨论】:

  • "Ghostscript 无法生成 GIF" 因此,必须有一个额外的步骤将它告诉 Ghostscript 生成的任何光栅(比如 TIFF)转换为 GIF。我认为这将是转换时间的很大一部分。尝试使用 Ghostscript 原生转换为的光栅图像格式。
  • 这可能是速度变慢的原因:imagemagick 必须对 gs 输出进​​行额外的转换。
  • 使用 Ghostscript 帮助我更好地理解了这个问题:为了获得我需要的质量,我必须使用选项“-dGraphicsAlphaBits=4”来请求高质量的渲染。而那个就是所有时间的来源。
  • @user1074069:您的标题要求“最快的方式”进行转化。你'需要质量'甚至没有被提及!取而代之的是,您甚至在色彩输出方面做出了妥协,并准备为黑白而牺牲它以提高速度。什么给了?
  • @Kurt Pfeifle:我会假设图像质量是一个固有问题。无论如何,你的 cmets 确实帮助我澄清了这个问题,所以给你金星和饼干!谢谢!现在我必须决定什么样的权衡是可以接受的。可能需要寻找更复杂的解决方案。
【解决方案2】:

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

我正在寻找一种更快的方法,最好通过修改 “转换”的选项。

当我说“快”时,最好是几秒钟,但我会采取任何重要的 加速。适合交互式 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 格式输出真的很酷 :-)

【讨论】:

    猜你喜欢
    • 2011-01-21
    • 2015-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-26
    • 1970-01-01
    • 1970-01-01
    • 2010-09-09
    相关资源
    最近更新 更多