【プログラム】Script-Fu
GIMP
手持ちのにゃんこ軍団の一言レビューしたくて、手持ちの超激レアをパーティのスロットにいれてiPhoneでスクショしました
サムネのようなパーティの部分だけ切り取りたいのですが、
19枚ほどにもなってしまったので、マウスなど手作業で同じサイズで切り抜くのはしんどいなと・・・
なので、これをバッチ処理したいと思いました
そういえばこういうことやったこと無いな、と思い
これを機に、知見を得ようというところです
画像をいじる優秀なアプリケーションで、スクリプトも使えるといえば、Photoshopなどですが、あいにく持っていないので、GIMPを使いたいとおもいます
Script-Fu
初めて聞きますわ・・・
ぐぐってみると、文法からLISP・・?、と思いつつ、
Emacsで耐性がついているので、そこまで泡を吹くほどでもないかなと
関数リファレンスはあるようなので、見て見る限り、やりたい事はできそうです
しかし・・・英字入力できない・・・バグか・・・?
ぐぐってみると、どうもバグのようでした
GIMPを最新にアップデートしてみたところ、直りました
さて、やりたい処理としては、
画像を開く
特定の矩形で切り抜く
png/jpgで出力する
ができれば十分ですね
特定の矩形で切り抜く
まずは、矩形領域にコピーできるのかを、スクリプト書きながらお試ししました
先人の知恵を借りると、お作法としては、
・開いている画像IDのリストを取得
・画像IDで選択・コピー
・新規の画像を作成
・その画像にペースト
という感じかな?
しかし
・・・IMAGE型?
・・・DRAWABLE型?
何が違うのよ・・?
ざーっと調べてみると、大雑把な理解としては、
下記のような感じと認識しました
・imageは画像やファイルみたいなイメージ
・drawableは編集しているデータの集合体のようなイメージ
なんとなくの理解のまま、工程毎に関数を調べてみると、
非常・・・・・・っに面倒くさい・・・
なんでこんなに面倒くさいの・・・?
;; 画像IDを知る
(gimp-image-list)
;; パーティ部分を選択する
(gimp-rect-select 1 805 168 1340 360 2 FALSE 0)
;; 選択部分をコピーする
(gimp-edit-copy (car (gimp-image-get-active-drawable img1)))
;; ペーストして画像を作る
(gimp-edit-paste-as-new-image)
たったこれだけを知るのに時間を費やしてしまった・・・
でも、やっぱり面倒くさいので、切り抜きぐらいあるでしょ?
と探すと、やっぱりありましたね
;; 任意の矩形で切り抜く
(gimp-image-crop image 1340 360 805 168)
おかしいと思いましたよね・・・
お作法を体験するということで必要経費と捉えます・・・
png/jpgで出力する
つづけて、画像出力の方法を調べてみると、何パターンか選べそうです
noteにアップするので、png/jpgあたりが妥当でしょう
gimp-file-save
を使ってみようとしたのですが、なんだか引数がよくわからんのです
最後に使ったモードで出力してくれる、ようなモードがありますが、
最初はどうなるの?とイマイチなので、直接png指定する関数を選択しました
file-png-save-defaults
defaultの設定で出力するこちらの関数が使えそうです
画像を開く
こちらは、他に選択肢はないのでしょう
gimp-file-load
です
まとめ
まとめると、それぞれの工程は
画像を開く
gimp-file-load
特定の矩形で切り抜く
gimp-image-crop
png/jpgで出力する
file-save-png-default
で、できそうな感触です
Scheme
いざ、つなげてはみたものの、なかなかうまくいきません・・・
どうも変数の宣言や、ループの書き方、文字列の連結など細かい部分で、怒られてしまいました
やっとこさ調べてわかったのですが、
LISPということで調べていてもダメなのですね・・・
Script-Fu は Scheme という言語なのですね
そして、Emacs Lisp とも異なるとのこと・・・
Scheme で調べて、文法を覚え、書き方を調べればスイスイ書けました😅
結局、泡吹いたわけですね🦀
まとめ
できあがったものは、こんなところです
イマイチ、お作法が足りていないところがありますが、ご容赦を
;; iPhone12MaxProのスクショサイズ前提
;; 固定矩形サイズで切り抜く
(define (nyanko-party-thumbnail-crop image)
(gimp-image-crop image 1340 360 805 168)
)
;; 固定矩形サイズで切り抜いて、pngで保存する
(define (nyanko-party-thumbnail-crop-save image filename)
(nyanko-party-thumbnail-crop image)
;; pngとしてセーブする(jpg指定のfile-jpeg-saveや、gimp任せのgimp-file-saveがある)
;; RUN-NONINTERACTIVE ダイアログなしでセーブされる
;; RUN-INTERACTIVE ダイアログありでオプションが選べる
(file-png-save-defaults
RUN-NONINTERACTIVE
image
(car (gimp-image-get-active-drawable image))
filename
filename
)
)
;; 一括切り抜き処理
(define (run-all-nyanko-party-thumbinail-crop-save)
(define (loop-func array)
(let
(
(filename (car array))
)
(unless (equal? filename "")
(nyanko-party-thumbnail-crop-save
(car (gimp-file-load RUN-NONINTERACTIVE filename filename)) ;;gimp-file-loadの返り値がIMAGE型のリストになっている
(string-append filename "_thumb.png") ;; 出力ファイル名を生成する
)
(loop-func (cdr array))
)
)
)
(loop-func
;; listにファイル名を追加し、最後を""で終わらせること
(list
;;"c:/Users/username/Desktop/image.PNG"
""
)
)
)
ハマりどころは、こんなところでした
for / while ループがない・・・
再帰呼出で実装するのがお作法だとか
面白かったですが・・・慣れない・・・
gimp-file-load の返り値を直接、gimp-image-cropに渡していた
ずっとエラーになっていて、ええええ??とずっと悩んでいました
car で先頭取り出しする必要がありました
コンソールを見て、すぐに気がつけばよかった・・・
let の書き方が悪く、構文エラーが取れない・・・
初歩中の初歩でしたね・・・
お勉強をし直しました
これにて、気持ちよく19枚の画像を出力することができましたとさ
あとで思い出したのですが、OpenCVでも良かったですね・・・
そっちの方がプログラマとして今後も活かせそうだったな・・・
しゅん・・・
この記事が気に入ったらサポートをしてみませんか?