【问题标题】:How to batch convert PostScript files to PNGs via folder action with use of ImageMagick如何使用 ImageMagick 通过文件夹操作将 PostScript 文件批量转换为 PNG
【发布时间】:2014-11-18 18:49:22
【问题描述】:

我正在尝试将文件夹操作分配给包含 PS 文件的文件夹,该文件夹会自动将放置在文件夹中的 PS 文件转换为 PNG 文件。我的 shell 脚本如下所示:

for img in "$@"; do
    filename = ${img%.*}
    convert "$img" -background white -flatten "$filename.png"
done

下面的屏幕截图中提供了我的 Automator 文件夹操作的设置

我遇到了两个问题:

  • 当我将 *.ps 文件放到文件夹中时,Automator 操作会启动,但不会生成文件。我猜问题在于没有将文件名传递给 Shell 脚本,但我无法找到解决方案。
  • 当我尝试使用以下命令直接从终端执行转换时:convert b.ps b.png 生成的图像被剪切,如下面的屏幕截图所示 。

我想修复 Automator 操作: - 获取我决定通过 Filter Finder Items 选项指定的所有文件 - 将它们转换为符合原始 PS 文件大小的高分辨率、高质量的 PNG(不切割它们或提供额外的边距)

【问题讨论】:

    标签: bash shell imagemagick postscript automator


    【解决方案1】:

    (您应该在问题中清楚地说明您正在使用 Mac OSX。)


    在转换 PS 文件时,您可能在 ImageMagick 中遇到了错误(另请参阅 IM 论坛中的 this discussion)。尝试将-verbose 添加到您的convert 命令中,看看到底发生了什么。

    事实是,ImageMagick 本身不能使用 PostScript(或 PDF)输入。它必须雇佣一个委托来为你做这件事——而这个委托通常是 Ghostscript。

    如果你让你的 shell 脚本区分不同的输入类型,这对你的任务来说是一个更好的方法:如果你得到 PS 或 PDF,让 Ghostscript 直接完成这项工作:

    gs                     \
     -o output.png         \
     -sDEVICE=pngalpha     \
     -dAlignToPixels=0     \
     -dGridFitTT=2         \
     -dTextAlphaBits=4     \
     -dGraphicsAlphaBits=4 \
     -r72x72               \
      input.ps-or-pdf
    

    如果您需要对生成的output.png 进行进一步后处理(例如制作背景white 而不是transparent,您现在可以将输出通过管道传送到ImageMagick convert-command....


    更新

    因为它在评论中被问到:如果您想使用相同的文件名进行输出,但将 .ps 后缀替换为 .png 后缀,请使用此 Bashism:

    inputfilename=../somedir/somefile.ps
    
    gs                             \
      -o ${inputfilename/.ps/.png} \
      -sDEVICE=pngalpha            \
      -dAlignToPixels=0            \
      -dGridFitTT=2                \
      -dTextAlphaBits=4            \
      -dGraphicsAlphaBits=4        \
      -r72x72                      \
       ${inputfilename}
    

    或者这个

     -o $(dirname ${inputfilename})/$(basename ${inputfilename}).png
    

    两者都允许您保留原始目录(如果您的“输入文件名”包含绝对或相对路径)。第一个对输入文件的后缀没有那么灵活:它只适用于.ps——对于PDF,你会得到一个.pdf.png 后缀...

    更新 2

    首先确定原始 PostScript 覆盖的真实BoundingBox。这与 已声明 BoundingBox 不同,后者可能(也可能不会!)在 PostScript 代码的 %%BoundingBox 行中声明。 Ghostscript 的-sDEVICE=bbox 会为您做到这一点:

     gs -q -o - -sDEVICE=bbox a.ps
    
       %%BoundingBox: 102 118 866 698
       %%HiResBoundingBox: 102.257997 118.502434 865.278747 697.013979
    

    现在您可以使用此信息来确定您希望调整 PNG 输出文件大小的水平像素数和垂直像素数。我将选择 940 像素宽和 760 像素高(以在输出周围留出一些边距。使用 -g940x760 和 Ghostscript 将其设置为页面大小:

    inputfilename=a.ps
    
    gs                             \
      -o ${inputfilename/.ps/.png} \
      -sDEVICE=pngalpha            \
      -dAlignToPixels=0            \
      -dGridFitTT=2                \
      -dTextAlphaBits=4            \
      -dGraphicsAlphaBits=4        \
      -g940x760                    \
       ${inputfilename}
    

    输出在这里:

    【讨论】:

    • 非常感谢您的 cmets 和有用的链接。我想我可以接受基于 gs 的解决方案。我想问,如何将output.png更改为带有PNG扩展名的原始文件名?很抱歉在我的帖子中没有提到 Mac OS X,我确信截图和“automator”标签就足够了。
    • 您好,非常感谢您提供的有用建议。我尝试了提供的代码,但它返回了错误。 (...) Current allocation mode is local Last OS error: Invalid argument GPL Ghostscript 9.10: Unrecoverable error, exit code 1
    • @Konrad:这不是完整的错误消息。最重要的人很可能会说:Error: .... 这句话对你说了什么?您可以将完整的消息粘贴到公共 Pastebin 中的某处吗?
    • @Konrad:可能我的指示不够清楚,导致你犯了错误。我会尽力澄清。
    • @Konrad:对不起,我的例子中有一个愚蠢的错误。应该是dirname不是 basedir。以上更正!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-19
    • 1970-01-01
    • 1970-01-01
    • 2011-03-12
    • 2011-08-01
    • 1970-01-01
    • 2017-03-29
    相关资源
    最近更新 更多