在同一脚本中使用 GIMP 的批处理脚本以多种格式导出图像的最佳方式?

Best way to export an image in multiple formats using GIMP's batch scripting in the same script?

我正在尝试自动创建不同格式的 GIMP 图像副本,以便在网站上提供它们(使用图片元素,提供多个版本的图像以实现兼容性)。所以我一直在尝试构建一个脚本来执行此操作,这样我就不必手动导出每个图像,也可以让我自己定义自己的图像默认值。

到目前为止,我已经能够拼凑出一个脚本来实现我的大部分目标:

(define (hugo-image-processing filename)
  (
    let* (
      (image (car (gimp-file-load 1 (string-append filename ".xcf") (string-append filename ".xcf"))))
      (drawable (car (gimp-image-get-active-layer image))))
    (file-png-save-defaults 1 image drawable (string-append filename ".png") (string-append filename ".png"))
    (file-heif-av1-save 1 image drawable (string-append filename ".avif") (string-append filename ".avif") 100 1)
    (file-webp-save 1 image drawable (string-append filename ".webp") (string-append filename ".webp") 0 1 100 100 1 1 1 1 0 0 0 1 1)
    (gimp-image-delete image)
  )
)

这有效,图像以预期的格式导出,但我注意到输出文件的大小因图像的保存顺序而异。在上述情况下,我的测试图像导出为 139 kB 的 AVIF 文件,而我的 WebP 文件为 76 kB。如果我交换顺序,将 AVIF 文件保存在 WebP 文件之后,WebP 文件仍然包含 76 kB,但 AVIF 文件现在大小为 58 kB。

如果移动 file-png-save-defaults 也可以看到此行为(尽管 WebP 在任何顺序下都保持一致的 76 kB)。

我猜文件--保存命令正在修改图像或可绘制对象,但我还不太明白为什么。我对 Scheme 不是很熟悉,所以除了观察这种行为之外,我解决这个问题的能力是有限的。对此问题的任何意见将不胜感激。

我 运行 这个命令 gimp-2.10 -i -b "(hugo-image-processing \"working\")" -b "(gimp-quit 0)" 调用脚本,我在 Windows 11.

上使用 Gimp 2.10.30

根据评论,问题似乎来自 file-webp-save 调用中的虚假“另存为动画”标志。可能是 2.10.30 中的错误,我无法在我的 2.10.24 中重现,即使有动画标志。

我用下面的代码测试了这个问题:

def fullname(name,extension):
    return "/tmp/"+name+"."+extension

def savemulti(image):
    xcf=fullname(image,"xcf")
    png=fullname(image,"png")
    avif=fullname(image,"avif")
    webp=fullname(image,"webp")
    image=pdb.gimp_file_load(xcf,xcf)
    drawable=image.active_layer
    pdb.file_png_save_defaults(image,drawable,png,png)
    pdb.file_webp_save(image,drawable,webp,webp,0, 1, 100, 100,1, 1, 1, 1, 0, 0, 0, 1, 1)
    pdb.file_heif_save(image,drawable,avif,avif,100,1)
    gimp.Display(image) # Start an image window

(最后启动一个 Gimp window,其中包含图像而不是删除图像)。

Copy-paste 在 python-fu 控制台中,编辑 fullname(...) 函数后,调用 savemulti("TestImage")。当 windows 出现时,您可以检查图层列表,看看是否有额外的图层...