GIMP Python-fuやスクリプトによるプラグインの作り方

gimp スクリプト プラグイン

画像処理ソフトGIMPは、Python-fuやスクリプトで画像を正方形にするプラグインを作れば、手作業のステップを自動化、効率化することができます。

ここで説明するのは、横長や縦長の画像を引っ張って正方形にするのではなく、縦横比はそのままで、画像の両端に余白を入れての正方形です。
 
 

 
 
Ptyhon-fuとscript-fuのどちらでもプラグインを作ることができますが、それぞれルールが異なるので、両方ともに作ってみたいと思います。

手作業から必要な情報を得る

プログラムを作る前に、どうのようにしてバッチ処理させるかを考えなければなりません。といっても、手作業でする処理を自動化させるだけなので、実際の作業で自動化させるために必要な情報を拾っていくことになります。

横長や縦長の画像を正方形にするには、キャンバスサイズを変更します。単に画像を正方形にするには画像サイズ変更をすれば正方形になるのですが、仮にスリムで綺麗な女性の横長画像だったら、肥満体型の画像になってしまいますから。^^;

画像タブの「キャンバスサイズの変更」をクリックするとこのような画面ができます。

キャンバスサイズの変更

横長の画像を正方形にする場合、手作業ではこういう手順です。
①縦横比の維持がされていないことを確認する。
②高さを幅と同じ数値に変更。
③中央のボタンを押す。
④リサイズのボタンを押す。

キャンバスサイズを変更すると、元の画像の周りに新しい画像の領域を作ることができます。新しい領域を作って保存することでサイズ変更した画像をつくることができるのです。

正方形に変更

正方形にするには、横長の画像だったらその上下に新しい領域(空白)を、縦長の画像だったら左右に新しい領域を作成します。

ここでバッチ処理を作るために必要なのはオフセット。下の画像のように、正方形を作るために必要な、画像の端からの空白の距離、オフセットYの数値を計算で割り出します。

オフセット値

バッチ処理 script-fu

バッチ処理には2種類あり、一つはschemeというプログラミング言語で作成するscript-fuです。

このscript-fuは少々独特ですが、Macでgimpのバッチ処理を作った後の処理はこちらの方がカンタンです。

script-fuでバッチ処理を作るとこうなります。(お使いになる場合は丸々コピーして下さい。)

(define (script-fu-square-fixresize img drawable)
 (let* ((orgwidth 0)(orgheight 0)(newheight 0)(newwidth 0)
        (diffvalue 0)(xoffset 0)(yoffset 0)
        )
         
        ; アンドゥしたらここに戻る
        (gimp-image-undo-group-start img)
        
        (set! orgwidth (car (gimp-image-width img)))
        (set! orgheight (car (gimp-image-height img)))
             
        (if (> orgwidth orgheight) ;幅が高さより大きい場合
            (begin
                (set! diffvalue (- orgwidth orgheight)) 
                (set! newheight (+ orgheight diffvalue)) ;高さを修正
                (set! newwidth (+ orgwidth 0))
                (set! yoffset (/ diffvalue 2))
            )
            (begin
                (set! diffvalue (- orgheight orgwidth)) 
                (set! newwidth (+ orgwidth diffvalue)) ;高さを修正
                (set! newheight (+ orgheight 0))
                (set! xoffset (/ diffvalue 2))
            )
        )                
  
        ; キャンバスサイズ変更
        ; 最後の4つの引数は 幅, 高さ, xオフセット, yオフセット
        (gimp-image-resize img newwidth newheight xoffset yoffset)

        ; 表示に反映
        (gimp-displays-flush)
  
        ; ここまでがアンドゥの対象
        (gimp-image-undo-group-end img)
        
       );end of let
);end of define

(script-fu-register
  "script-fu-square-fixresize"
  "<Image>/Script-Fu/正方形に変更"
  "画像サイズを取得してで正方形に変更"
  "atushi"
  "(c) 2021"
  "2021-04-19"
  "RGB*, GRAY*, INDEXED*"
  SF-IMAGE "Image" 0
  SF-DRAWABLE "Drawable" 0
)

幅か高さかどちらか大きいほうから小さいほうを引き、その数値を2で割ってオフセットを取得。幅と高さを揃えたそれぞれの数値を、変数に入れてキャンバスサイズを変更します。

script-fuは変数を使う場合は使用する変数を宣言します。このへんはVBAとほぼ同じですが、型はこうです。

宣言に使う為の命令 (使用する変数 格納する数値)
let* (orgwidth 0)

ここでは変数に0をいれています。

計算は引き算の記号、引かれる数値、引く変数の順番で()の中に記述し、新たな変数に格納します。その際に使うのが set! になります。少し混乱しますが、こんな感じです。

(set! 新たな変数 (- 引かれる数値 引く数値))

普通の計算式だと、
『新たな変数 = 引かれる数値 – 引く数値』
になりますが、これがscript-fuの特徴です。

条件分岐の比較も同じように、A > B なら、

if(> A B)

です。

では、それぞれ説明していきます。

オフセットを割り出すためには、画像の高さと幅を取得します。

(set! orgwidth (car (gimp-image-width img)))
(set! orgheight (car (gimp-image-height img)))

そして、高さと幅の差を計算。

(set! diffvalue (- orgwidth orgheight)) ;幅が高さより大きい場合

高さと幅の数値を合わせます。

(set! newwidth (+ orgwidth diffvalue)) ;高さを修正

高さと幅の差を2分してオフセットを割り出す。

(set! yoffset (/ diffvalue 2))

キャンバスサイズを変更。imgの後ろは、幅・高さ・オフセット(x)・オフセット(y)

(gimp-image-resize img newwidth newheight xoffset yoffset)

作成したバッチ処理を機能させるためにGIMPのメニューに表示させる必要があります。それが、script-fu-register以下の情報です。
上で作成したコードを形式的に表示すると

(script-fu-register
  "バッチ処理の名前" ← script-fu-square-fixresize
  "バッチ処理をGIMPに表示させる位置" ; ← /Script-Fu/正方形に変更
  "このバッチ処理の説明" ; ← 画像サイズを取得してで正方形に変更
  "作者名" ; ← atushi
  "コピーライト" ; ← (c) 2021
  "作成日" ; ← 2021-05-04
  "バッチ処理が動作可能な画像のモード"  ; ← RGB*, GRAY*, INDEXED*
  引数1 ; ← SF-IMAGE "Image" 0 
  引数2 ; ← SF-DRAWABLE "Drawable" 0
)

はじめの行のバッチ処理の名前は、任意の名前で大丈夫ですが、コードの最初にある、defineの部分でも同じ名前にしたほうが良いです。

(define (script-fu-square-fixresize img drawable)

その次がGIMPの画面に表示させるメニューの位置。registerの部分で重要な部分です。(バッチ処理を作っても動作させることができなければ意味がありません。)

そのあとは上で説明している通りですが、引数1、2に関してはこのまま使うのが良いでしょう。現時点では詳しく調査していません。(笑)

保存とGIMPの画面への表示

このコードを○○○.scmというように適当な名前にして、scriptsというフォルダの中に保存します。

スクリプトフォルダ

GIMPを再起動するか、フィルタータブのscript-fu(s)からスクリプトの再読み込みをクリックすることでGIMPが認識してくれます。

配置したメニューをクリックすれば横長でも縦長でも正方形になります。

バッチ処理メニュー

script-fuの条件分岐

このバッチ処理では、最後に一回でキャンバスサイズを変更しているので、幅が高さより大きい場合と、高さが幅より大きい場合のそれぞれで必要な数値を、条件分岐で取得しています。

他の言語だと、「幅 > 高さ」ではないなら、このようにelseのあとに処理を付け加えますが

if (幅 > 高さ)
else
 処理

script-fuだと、

(if (幅 > 高さ)
  (begin)
  (begin 処理 )

になります。

バッチ処理 python-fu

もう一つはpythonで作る、python-fuでのバッチ処理プログラムです。

このpython-fuはscript-fuのように独特なものではなく、VBAやphpがわかれば作成できるものです。しかし、Macでpython-fuをGIMPに認識させるために、こちらのページで説明しているような作業が必要になります。

python-fuでのバッチ処理はこちら。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
from gimpfu import *
 
def plugin_main(image, layer):
 
    image = gimp.image_list()[0]
    orgWidth = image.width
    orgHeight = image.height
             
    if orgWidth > orgHeight:
        diffvalue = orgWidth - orgHeight
        newWidth = orgWidth
        newHeight = orgHeight + diffvalue
        x = 0
        y = diffvalue / 2
        
    elif orgHeight > orgWidth:
        diffvalue = orgHeight - orgWidth
        newWidth = orgWidth + diffvalue
        newHeight = orgHeight
        x = diffvalue / 2
        y = 0
        
    image.resize(newWidth,newHeight,x,y)
 
register(
        "square_revision",
        "resize to square",
        "resize to square",
        "Atsushi",
        "Atsushi",
        "2021/4/19",
        "<Image>/Filters/Languages/正方形にする",
        "RGB*, GRAY*",
        [],
        [],
        plugin_main)
 
main()

python-fuでオフセットを割り出すのも、基本的にはscript-fuと同じ。
まず表示されている画像を取得し

image = gimp.image_list()[0]

幅と高さを取得します。

orgWidth = image.width
orgHeight = image.height

そして、幅と高さの差を計算。

diffvalue = orgWidth - orgHeight

こちらでも高さと幅を2分しオフセットを割り出します。

y = diffvalue / 2

幅、高さ、オフセット(x)、オフセット(x)をそれぞれ指定し、キャンバスサイズを変更します。

image.resize(newWidth,newHeight,x,y)

これもscript-fuと同じですが、python-fuの形式として、
コード先頭の

#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
from gimpfu import *
 
def plugin_main(image, layer):

と最後の
register()
main()
は必ず必要になります。

registerはGIMPの画面に表示させるための情報になるので、適切な情報を入力します。
適切な情報を形式的に表示すると

register(
        "バッチ処理の名前", ← square_revision
        "簡単なバッチ処理の説明", ← resize to square
        "詳しいバッチ処理の説明(上と同じでOK)", ← resize to square
        "作成者の名前", ← Atsushi
        "著作権保有者(作成者の名前と同じ)", ← Atsushi
        "著作権の日付", ← 2021/5/4
        "バッチ処理をGIMPに表示させる位置", ← /Filters/Languages/正方形にする
        "処理する対象の画像タイプ", ← RGB*, GRAY*
        #引数(型, 名前(プロシージャブラウザに表示される),説明, 初期値), ← []
        #戻り値, ← []
        #メソッド名 ← plugin_main
)

python 正方形

バッチ処理の名前は任意のもので大丈夫ですが、この名前は、コマンドラインまたはスクリプトから呼び出すためのコマンド名となります。

#引数、#戻り値はこの簡単なバッチ処理の場合、[]にしておきます。メソッド名も plugin_main にしておいて問題ありません。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です