Command-Line

從 PSD 中提取文本層(ImageMagick 或 GiMP)

  • August 23, 2016

我想從圖層中提取文本資訊(如字型、字型樣式、字型大小和內容)以及圖層的名稱和編號。

標準 repo 上的所有可用命令行都是一個選項。

我知道它可以從 Photoshop 腳本中完成,但為了科學起見,我想從 Unix 伺服器上完成,以後可能會從 zip 中的多個文件中提取所有資訊並使用多種工具處理它們。

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

這很麻煩,因為我們從 STDIN 執行批處理模式並重定向腳本。我們還得到了提示輸出,這很醜陋,但應該適用於大多數 GIMP 版本。

這是如何運作的:

  • 由於我們只載入了一張圖片,我們知道它被命名為1.
  • 我們得到層(gimp-image-get-layers 1)
  • vector-ref這些層是一個固定的向量,所以我們使用(inside a while)遍歷它們
  • (gimp-item-is-text-layer layer)為我們提供是否可以在圖層上執行文本特定操作的資訊。
  • gimp-text-layer-get-*給我們關於文本層的資訊。
  • 對於非文本層,我們列印較少的資訊。

如何獲取 script-fu 的函式參考?

在 GIMP 中轉到Filters -> Script Fu -> Console. 在那裡,在您可以插入方案命令的文本欄位旁邊,您會看到一個按鈕Browse,用於獲取您的 GIMP 版本的參考。

免責聲明:這個測試很差,我只有一個簡單的兩層(沒有任何文字)PSD來測試它。

引用自:https://unix.stackexchange.com/questions/305073