自定义脚本

概述

批处理管理器支持通过 自定义脚本 工具来扩展图片处理流程,让你能用 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 >**将返回值传给工作流。

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

示例

概念验证

下面这个示例脚本其实没什么特别功能。它主要做这些事:把批处理管理器传给脚本的输入/输出文件名和图片属性,打印到控制台;把输入文件原样拷贝到输出路径(这步不能省,不然会报错说找不到输出文件);返回文件拷贝命令的执行状态码,批处理管理器会根据这个状态码判断要不要继续处理。

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星

  • 项目标签是 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 应用水印的脚本结果