見出し画像

【プログラム】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でも良かったですね・・・
そっちの方がプログラマとして今後も活かせそうだったな・・・
しゅん・・・

この記事が気に入ったらサポートをしてみませんか?