自定义脚本

概述

批处理管理器支持通过 自定义脚本 工具来扩展图片处理流程,让你能用 ImageMagickExifTool 等外部工具处理图片。

基础工具 列表的 自定义工具 分类下可以找到这个 自定义脚本 工具。它的作用是为队列中的每张图片执行一段 shell 脚本,脚本里可以调用各种命令行程序。你完全可以在插件里直接编写这些脚本,还能使用一系列的环境变量来获取文件名和元数据。

在批处理管理器的图片处理流程中添加自定义脚本

这个工具提供这几个设置项:

  • 输出图片格式 :设置脚本处理后的图片格式。默认是 与输入相同 ,也可以选 JPEGPNGTIFF 。注意 JPEG 是有损压缩格式,只支持 8 位色深且不支持透明通道。

  • Shell 脚本 :在这里输入你的脚本代码。Linux/macOS 支持 Bash 脚本Windows 则支持 批处理脚本

脚本中可以使用以下关键字(注意区分大小写),运行时工具会自动替换这些变量:

  • $INPUT 会被替换成工作流程输入文件名(已转义特殊字符)

  • $OUTPUT 会被替换成工作流程输出文件名(已转义特殊字符)

重要

脚本执行后必须生成一个新文件到 $OUTPUT 路径。如果用的是不生成新文件的程序(比如用 ExifTool 修改元数据),得先用命令把 $INPUT 拷贝到 $OUTPUT ,再对 $OUTPUT 做修改。

脚本里还能调用这些环境变量:

  • TITLE: 对应 digiKam 的 标题 属性

  • COMMENTS: 对应 digiKam 的 说明 文字

  • COLORLABEL: 对应 digiKam 的 颜色标记 属性

  • PICKLABEL: 对应 digiKam 的 挑选标记

  • RATING: 对应 digiKam 的 评分星级

  • TAGSPATH: 对应 digiKam 的 标签 属性

这些变量值都来自 digiKam 数据库里存的图片属性。

备注

在 Linux 和 macOS 下,脚本中的环境变量可以用 $ 作为变量名的前缀(例如 $INPUT)。运行脚本时使用的解释器是 /bin/bash

在 Windows 下,脚本中可以使用 % 作为变量名的前缀和后缀来访问环境变量(例如 %INPUT%)。运行脚本的解释器是 cmd.exe

返回值

按照惯例,Linux 和 macOS 下的 Bash 脚本 成功时返回 0,错误时返回 1-255 范围内的整数。使用 exit < error_code > 将返回值传回工作流。

在 Windows 下, 批处理脚本 成功时返回 0,错误时返回其他值,但该值是有符号整数,因此也可能是负值。使用 EXIT /B < error_code > 将返回值传给工作流。

批处理管理器会处理脚本返回的值。如果返回零,工作流将继续正常执行;否则工作流将被中断,批处理管理器停止处理。

示例

概念验证

This first example shown below does nothing special. It prints on the console the input/output file names and item properties passed from the Batch Queue Manager to the script, and copies the input file to the output file (this stage is required to prevent the Batch Queue Manager from returning an error because the target file does not exist). The script returns the value from the file copy command, which is parsed by the Batch Queue Manager for each item in the workflow. See below the Bash version of the script:

echo "INPUT FILE: $INPUT"
echo "OUTPUT FILE: $OUTPUT"

echo "TITLE: $TITLE"
echo "COMMENT: $COMMENT"
echo "COLORLABEL: $COLORLABEL"
echo "PICKLABEL: $PICKLABEL"
echo "RATING: $RATING"
echo "TAGSPATH: $TAGSPATH"

cp $INPUT $OUTPUT
exit $?

See below the Windows Shell version of the script. The output is redirected and concatened to the C:tempdigikam.txt:

set infile=$INPUT
set outfile=$OUTPUT

echo INPUT FILE: %infile%  >>C:\temp\digikam.txt
echo OUTPUT FILE:  %outfile% >>C:\temp\digikam.txt

echo TITLE: %TITLE%  >>C:\temp\digikam.txt
echo COMMENT: %COMMENT%  >>C:\temp\digikam.txt
echo COLORLABEL: %COLORLABEL%  >>C:\temp\digikam.txt
echo PICKLABEL: %PICKLABEL% >>C:\temp\digikam.txt
echo RATING: %RATING% >>C:\temp\digikam.txt
echo TAGSPATH: %TAGSPATH% >>C:\temp\digikam.txt

copy %infile% %outfile%

如果你是从终端启动 digiKam 的,而且在 设置/其他(杂项)/系统 里开了调试日志,就能在终端看到类似这样的输出。

digikam.general: Action Thread run  1  new jobs
digikam.general: Tool : index=  1  :: name=  "UserScript"  :: group=  Digikam::BatchTool::CustomTool  :: wurl=  QUrl("file:///mnt/data/Images/SALAGOU")
digikam.general: path:  "/mnt/data/Images/SALAGOU/BatchTool-EpEjEz-9e1c7a12.digikamtempfile.JPG"
digikam.general: Tool:        "User Shell Script"
digikam.general: Input url:   QUrl("file:///mnt/data/Images/SALAGOU/DSC08833.JPG")
digikam.general: Output url:  QUrl("file:///mnt/data/Images/SALAGOU/BatchTool-EpEjEz-9e1c7a12.digikamtempfile.JPG")
digikam.dplugin.bqm: Script stdout "INPUT FILE: /mnt/data/Images/SALAGOU/DSC08833.JPG\nOUTPUT FILE: /mnt/data/Images/SALAGOU/BatchTool-EpEjEz-9e1c7a12.digikamtempfile.JPG\nTITLE: Salagou Trip\nCOMMENT: \nCOLORLABEL: 5\nPICKLABEL: 3\nRATING: 3\nTAGSPATH: Places;Places/France;Places/France/Salagou Lake\n"
digikam.dplugin.bqm: Script stderr ""
digikam.dplugin.bqm: Script exit code: 0

从数据库里提取出来的信息就是:

  • 所处理的项目是 /mnt/data/Images/SALAGOU/DSC08833.JPG

  • 目标文件名是 /mnt/data/Images/SALAGOU/BatchTool-EpEjEz-9e1c7a12.digikampetfile.JPG (由批处理管理器生成的临时文件)。

  • 项目标题为 Salagou Trip

  • 项目注释为空。

  • 项目颜色标记为 5 (绿色)。

  • 项目挑选标记是 3 (已接受)。

  • 项目评分为 3星

  • 项目标签是 PlacesPlaces/FrancePlaces/France/Salagou Lake

使用 ImageMagick 添加水印

下面这个示例就复杂多了,它用 ImageMagick 的命令行工具给队列里的每张图片叠加多行文字水印。

watermark="This image is\ncopyrighted and\navailable with\nlimited usage"

in_file="$INPUT"
out_file="$OUTPUT"

convert -size 2000x1000 xc:none -gravity center \
    -stroke yellow -pointsize 120 -font Courier-BoldOblique \
    -strokewidth 3 -annotate +100+100 "${watermark}" \
    -blur 0x25 -level 0%,50% \
    -fill white -stroke none -annotate +100+100 "${watermark}" \
    "${in_file}"  +swap -gravity center -geometry +0-3 \
    -composite  "${out_file}"

备注

这个脚本里没有专门写 exit 命令来返回值。Bash 会自动把最后执行的命令结果作为脚本返回值,在这里就是 ImageMagick 的 convert 工具 的执行状态。

所得结果如下。

使用 ImageMagick 应用水印的脚本结果