自定义脚本¶
概述¶
批处理管理器支持通过 自定义脚本 工具来扩展图片处理流程,让你能用 ImageMagick 或 ExifTool 等外部工具处理图片。
在** 基础工具** 列表的 自定义工具 分类下可以找到这个 自定义脚本 工具。它的作用是为队列中的每张图片执行一段 shell 脚本,脚本里可以调用各种命令行程序。你完全可以在插件里直接编写这些脚本,还能使用一系列的环境变量来获取文件名和元数据。

在批处理管理器的图片处理流程中添加自定义脚本¶
这个工具提供这几个设置项:
脚本中可以使用以下关键字(注意区分大小写),运行时工具会自动替换这些变量:
$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 >**将返回值传给工作流。
批处理管理器会处理脚本返回的值。如果返回零,工作流将继续正常执行;否则工作流将被中断,批处理管理器停止处理。
示例¶
概念验证¶
下面这个示例脚本其实没什么特别功能。它主要做这些事:把批处理管理器传给脚本的输入/输出文件名和图片属性,打印到控制台;把输入文件原样拷贝到输出路径(这步不能省,不然会报错说找不到输出文件);返回文件拷贝命令的执行状态码,批处理管理器会根据这个状态码判断要不要继续处理。
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 $?
如果你是从终端启动 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星。
项目标签是 Places,Places/France,Places/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 应用水印的脚本结果¶