【问题标题】:Merging every pair of images with ImageMagick and GNU Parallel使用 ImageMagick 和 GNU Parallel 合并每对图像
【发布时间】:2019-12-08 21:09:35
【问题描述】:

我正在尝试合并文件夹中的每一对图像,并使用 imagemagick 将结果合并到 PDF 文件中,并使用 GNU Parallel 并行化该过程。

parallel -N2 convert \( {1} -rotate 30 \) {2} +append miff:- ::: *jpeg | convert - out.pdf

问题是我需要旋转第一个参数并发生错误。

Error: /bin/sh: -c: line 0: syntax error near unexpected token `01.jpeg'
/bin/sh: -c: line 0: `convert ( 01.jpeg -rotate 30 ) 02.jpeg +append miff:-'
...

如何处理 GNU 并行接收的参数之一?

【问题讨论】:

    标签: imagemagick imagemagick-convert gnu-parallel


    【解决方案1】:

    首先,你最好使用parallel -k,否则输出的顺序会错误。

    其次,您不需要括号来确保您的 -rotate 仅适用于第一张图片,因为此时您还没有加载第二张图片。

    所以,您正在查看:

    parallel -k -N2 convert {1} -rotate 30 {2} +append miff:- ::: *jpeg | convert - out.pdf
    

    或者也许:

    parallel -k -N2 'convert {1} -rotate 30 {2} +append miff:-' ::: *jpeg | convert - out.pdf
    

    在回答您的问题时,ImageMagick 将对已加载堆栈中的所有图像应用运算符(如 -rotate)。所以:

    convert im1.png im2.png -rotate ...
    

    将旋转两个图像。鉴于:

    convert im1.png -rotate 90 im2.png ...
    

    只会旋转第一张图片。如果你只想旋转第二个,你有两个选择,要么把第二个放在括号里,所以-rotate 只适用于它:

    convert im1.png \( im2.png -rotate 90 \) ...
    

    或者,先加载第二张图片并旋转它,然后加载第一张并交换顺序:

    convert im2.png -rotate 90 im1.png +swap ...
    

    【讨论】:

    • 谢谢!完美运行!你能解释两件事:为什么我不需要括号?在您的第二个示例中使用引号有什么效果?
    • 我已经添加了一个解释。请再看看。
    • 谢谢。当您说“将第二个放在括号中”时,与 gnu parallel 结合使用时出现错误。除了旋转之外,我还有兴趣调用 composite 等其他命令。这就是我问的原因。你知道这是否可能吗?类似:parallel -k -N2 convert \( composite {1} \Test.jpeg -gravity Northwest \) {2} +append miff:- ::: *jpeg | convert - out.pdf.
    • 我是根据您的建议才找到的。我需要在将要并行使用的整个命令周围添加引号。
    • 不确定我能否为所有案例提供答案。一般来说,作为第一选择,我会尝试将 ImageMagick 的内容括在单括号中,如果这不起作用,请尝试使用 parallel --quote,如果不起作用,请尝试定义像这样的 bash 函数 stackoverflow.com/a/42029336/2836621跨度>
    猜你喜欢
    • 2019-03-14
    • 1970-01-01
    • 2021-06-12
    • 1970-01-01
    • 2014-10-02
    • 1970-01-01
    • 2021-04-18
    • 2017-09-09
    • 1970-01-01
    相关资源
    最近更新 更多