My studying notes for Java,Ruby,Ajax and other any interesting things.

星期二, 五月 16, 2017

windows下imagemagick水印处理脚本



近期在使用imagemagick处理水印,mac和linux下面都很实用,一个同事是windows系统,也需要类似功能。于是做了一个windows下面的脚本,同时学习了一下windows的bat处理脚本。(真心不好用)

大概记录一下脚本和流程:

— 脚本1:watermark.bat,负责调度和创建目录
echo off
SET IDTY="C:\Program Files\ImageMagick-7.0.5-Q16\identify.exe"
SET SOURCE_DIR="source"
SET LOGO="C:\windows.logo\logo.png"
SET TARGET_DIR="out"

%IDTY% -format "%%[fx:w] %%[fx:h]" %LOGO% > logo.txt

for /f "tokens=1,2" %%a in (logo.txt) do set lw=%%a&set lh=%%b


for /r %SOURCE_DIR% %%i in (*) do if not exist %TARGET_DIR%%%~pi mkdir %TARGET_DIR%%%~pi

for /r %SOURCE_DIR% %%i in (*) do (
      call logo.bat %%i
)

— logo.bat,负责进行logo处理和输出:

SET TARGET_DIR="out"
SET IMCONV="C:\Program Files\ImageMagick-7.0.5-Q16\convert.exe"
SET IDTY="C:\Program Files\ImageMagick-7.0.5-Q16\identify.exe"
SET SOURCE_DIR="source"
SET TARGET_DIR="out"
SET LOGO="C:\Users\zhangwenhui\Desktop\windows.logo++\logo.png"

for /f "tokens=1,2" %%a in (logo.txt) do set lw=%%a&set lh=%%b

@rem echo %lw% %lh%

%IDTY% -format "%%[fx:w] %%[fx:h]" %1 > %1.txt
for /f "tokens=1,2" %%a in (%1.txt) do set w=%%a&set h=%%b
del %1.txt
set /a width=%w%*30/100
set /a height=%lh%*%width%/%lw%
@rem echo w:%w% ,width:%width%,height:%height%

composite -gravity southeast ( %LOGO% -resize %width%x%height% ) %1 %TARGET_DIR%\%~pn1.jpg


有几点注意:
1.windows的bat脚本中的%(百分号)是个坑:
  case1:
    set xx='asdfbc'
    引用xx的时候使用%xx%
   case2:
    在命令行中 for /r /d %d in(*)  do echo %d
    在for里面使用的时候需要用%d的形式访问,然后在后续使用该变量的时候可以使用%d进行访问
  case3:
    在批处理脚本中的for,需要加两个百分号
    for /r /d %%d  in (*) do echo %%d
      如果在for中再进行set xx,就基本上搞不正确了,所以使用了call来调用另外一个脚本;

    2.批处理的执行顺序,在windows的bat处理的时候,感觉会类似递归的调用顺序,没有搞太明白。比如 block a中的block b,在执行的时候是block a把每个block单独输出到命令行被执行,而不是有一个解释器把整个脚本进行调度。
    3.bat中有替换功能,但是好像只能针对%a%的变量,而不能针对%a这样的变量
    4.imagemagick在windows上面默认不安装legacy utilities,所以convert,composite等功能都无法调用,在安装的时候需要选中;在composite的时候与mac略有不同,不需要使用转义括号。
    5.目录中如果有空格,则需要使用引号给引起来;

    印象笔记,让记忆永存。下载印象笔记