你如何在shell脚本中为imagemagick和多个mogrify命令编写一个循环

时间:2017-07-31 18:27:14

标签: shell loops imagemagick

我使用windows 7,cygwin和imagemagick v6.7.6以及以下mogrify命令...

mogrify \
-verbose \
-draw 'image over 0,0 0,0 "/cygdrive/L/temp/logo.png"' \
-gravity southeast \
-path /cygdrive/L/temp/og-rotate-logo *.jpg \
-adaptive-resize 1200x1200 \
-path /cygdrive/L/temp/1200px *.jpg

这目前确实有效,但不是我希望的方式。我认为我需要某种循环来做我需要的,但不知道该怎么做。

现在基本上上面的命令会在源照片中添加一个徽标并将其保存到名为og-rotate-logo的文件夹中,然后在源文件夹中完成所有源图像之后,它会移动到下一步并调整所有新徽标照片低至1200x1200并将该照片保存在名为1200px的文件夹中。这是我需要的结果,但是我想一步一步地对每张照片执行所有命令。如获取源图像,添加徽标,保存在og-rotate-logo文件夹中,然后调整大小为1200x1200,保存在1200px文件夹中,然后转到源文件夹中的下一个图像。

首先,有一种方法让我重新编写我的mogrify命令,以便在我想要的步骤中执行此操作,或者这也可以通过编写某种shell脚本文件来循环或其他东西。我完全不知道怎么做,喜欢学习,如果有人有时间帮助那将是伟大的!谢谢!

2 个答案:

答案 0 :(得分:0)

我不使用mogrify,这是根据我使用的一些转换代码改编而来的:

mogrify \
( -clone 0 -draw 'image over 0,0 0,0 "/cygdrive/L/temp/logo.png"' -gravity southeast -write -path /cygdrive/L/temp/og-rotate-logo *.jpg +delete ) \
-adaptive-resize 1200x1200 -path /cygdrive/L/temp/1200px *.jpg

啊这不起作用,因为它在第二次写入中保存原始图像而不是带有徽标的图像。

这是做什么的:

mogrify -draw 'image over 0,0 0,0 "/cygdrive/L/temp/logo.png"' -gravity southeast -adaptive-resize 1200x1200 -path /cygdrive/L/temp/1200px *.jpg
第三个去吧!你可能需要第一个 - 写:

mogrify -draw 'image over 0,0 0,0 "/cygdrive/L/temp/logo.png"' -gravity southeast -write -path /cygdrive/L/temp/og-rotate-logo *.jpg -adaptive-resize 1200x1200 -path /cygdrive/L/temp/1200px *.jpg

关于想要Windows版本的评论之后。以下工作,但由于某种原因,我得到一个错误,在数千个文件,这可能是一个痛苦!

另存为批处理文件,创建新文件夹并使用示例运行 - 首先使用一些测试文件。

::Turn of displaying the code on the screen
@echo off
setlocal EnableDelayedExpansion

REM Example command to run in the command box
REM Path to the batch file - originals file - logo added folder - resized folder
REM C:\Users\bonzo\Desktop\test.bat G:\Upload\originals G:\Upload\test G:\Upload\test1  

for %%f in (%1\*.jpg) do ( convert "%%f" -gravity southeast -draw "image over 0,0 0,0 ""G:\Upload\logo.png"" " -write "%2\%%~nf.jpg" -resize 200x200 -write "%3\%%~nf.jpg" )

编辑: 我已删除错误问题并将-draw更改为composite:

for %%f in (%1\*.jpg) do ( convert  "%%f" -gravity southeast "G:\Upload\logo.png" -composite -write "%2\%%~nf.jpg" -resize 200x200 -write "%3\%%~nf.jpg" null: )

答案 1 :(得分:0)

如果您出于某种原因想要控制订单,那么您最好使用自己的循环和convert。我不 Windows,但是一个文件的命令是:

convert InputFile.jpg \
  -gravity southeast  \
  -draw 'image over 0,0 0,0 "/cygdrive/L/temp/logo.png"' \
  -write /some/where/file.jpg                            \
  -resize 1200x1200                                      \
  /some/where/else/finalResult.jpg

所以,你需要围绕看起来像这种可憎的东西:

FOR /F ["options"] %%L IN (*.jpg) DO (
    convert %%L                                              \
      -gravity southeast                                     \
      -draw 'image over 0,0 0,0 "/cygdrive/L/temp/logo.png"' \
      -write /some/where/%%L                                 \
      -resize 1200x1200                                      \
      /some/where/else/%%L
}

或者,如果Windows可以执行更像bash

的操作
for f in *.jpg; do
    convert "$f"                                             \
      -gravity southeast                                     \
      -draw 'image over 0,0 0,0 "/cygdrive/L/temp/logo.png"' \
      -write /some/where/"$f"                                \
      -resize 1200x1200                                      \
      /some/where/else/"$f"
done