从 PSD(ImageMagick 或 GiMP)中提取文本图层

从 PSD(ImageMagick 或 GiMP)中提取文本图层

我想从图层中提取文本信息(如字体、字体样式、字体大小和内容)以及图层的名称和数量。

标准存储库上所有可用的命令行都是一个选项。

我知道这可以通过 Photoshop 脚本来完成,但为了科学起见,我想从 Unix 服务器上完成它,也许稍后从 zip 中的多个文件中提取所有信息并使用多个工具处理它们。

答案1

GIMP 具有可以从命令行运行的 script-fu 方案扩展。这将是粗略的,因为我已经有 3-4 年没有写过任何计划了,但这里什么也没有:

假设以下脚本位于名为 的文件中sc.sch

(define (go-by-layers no layers)
  (while (< 0 no)
    (let* ((layer (vector-ref layers (- no 1))))
      (display "Layer name: ")
      (display (car (gimp-item-get-name layer))) (newline)
      (if (< 0 (car (gimp-item-is-text-layer layer)))
          (begin
            (display "This is a text layer") (newline)
            (display "Font: ")
            (display (car (gimp-text-layer-get-font layer))) (newline)
            (display "Text: ")
            (display (car (gimp-text-layer-get-text layer))) (newline)
          ) )
      (if (>= 0 (car (gimp-item-is-text-layer layer)))
          (begin
            (display "Not a text layer")
            (newline)
          ) )
      (set! no (- no 1))
    )
  )
)
(let* ((layers (gimp-image-get-layers 1)))
  (display "Number of Layers: ") (display (car layers)) (newline)
  (go-by-layers (car layers) (cadr layers))
  (display "end") (newline)
)
(gimp-quit 0)

我们可以做的:

$ gimp zz.psd -b - < sc.sch 2>/dev/null
Welcome to TinyScheme, Version 1.40
Copyright (c) Dimitrios Souflis

ts> go-by-layers
ts> Number of Layers: 2
Layer name: Background
Not a text layer
Layer name: Layer 1
Not a text layer
end
#t

这是相当 hacky 的,因为我们从 STDIN 运行批处理模式并重定向脚本。我们还得到提示输出,这非常难看,但应该适用于大多数 GIMP 版本。

这是如何运作的:

  • 由于我们只加载了一张图像,因此我们知道它的名称为1.
  • 我们得到的层(gimp-image-get-layers 1)
  • vector-ref这些层是一个固定向量,因此我们使用(在 内while)遍历它们
  • (gimp-item-is-text-layer layer)为我们提供是否可以在图层上执行文本特定操作的信息。
  • gimp-text-layer-get-*给我们有关文本层的信息。
  • 对于非文本层,我们打印较少的信息。

如何获取 script-fu 的函数引用?

在 GIMP 中转到Filters -> Script Fu -> Console.在那里,在您可以插入方案命令的文本字段旁边,您会看到一个按钮Browse,用于获取您的 GIMP 版本的参考。

免责声明:这个测试很差,我只有一个简单的两层(没有任何文本)PSD来测试它。

相关内容