Python を使用して GIMP 用のプラグインを作成する

GIMP を拡張してタスクを自動化する

この記事では、スクリプトによって GIMP (GNU Image Manipulation Program) のタスクを自動化する方法を説明します。その一例として、フォルダー内のすべての画像をリサイズし、それらの画像をすべて同じフォーマットで保存する、という単純な 2 つのタスクを実行するスクリプトを作成します。また、Python スクリプト言語を使用して GIMP 用のプラグインを作成する方法を学びます。この新しいプラグインを使用するには、コマンドラインで gimp コマンドを実行します。

Nathan A. Good, Senior Consultant and Freelance Developer, Freelance Developer

Nathan GoodNathan A. Good はミネソタ州の Twin Cities エリアに住んでいます。彼はプロとしてソフトウェア開発やソフトウェア・アーキテクチャー、システム管理などを行っています。彼はソフトウェアを書いている時以外は、PC やサーバーを構築したり、新しい技術について資料を読んだり、そうした技術に取り組んだり、彼の友人達をオープソース・ソフトウェアに移行させようとしたりしています。彼は数多くの本や記事を執筆、あるいは共同で執筆しており、その中には『Professional Red Hat Enterprise Linux 3』や『Regular Expression Recipes: A Problem-Solution Approach』、『Foundations of PEAR: Rapid PHP Development』などがあります。



2011年 3月 29日

この記事では、GIMP-Python の使用法について説明します。この一連の Python モジュールから成る GIMP-Python を使用すると、GIMP (GNU Image Manipulation Program) のコマンドを自動化するプログラムを Python で作成することができます。GIMP-Python の Python モジュールは libgimp ライブラリーのラッパーです。GIMP-Python は Script-Fu 拡張機能とは異なり、Script-Fu ではプラグインを使用してスクリプトを実行しますが、GIMP-Python では Python スクリプト自体が中心となって処理を実行します。GIMP ではその内部で GIMP-Python スクリプトをインスタンス化することも、GIMP のバッチ・モードを使用して、コマンドラインから GIMP-Python スクリプトを実行することもできます。

この記事では、GIMP において 2 種類のタスクを自動化するための Python コードを作成する方法について学びます。1 つは画像をリサイズするタスクで、もう 1 つはリサイズされた画像を別のフォーマットで保存するタスクです。

GIMP と Python はどちらも、Linux® や Mac OS® X、Microsoft® Windows® など、さまざまなプラットフォームにインストールして使用することができます。GIMP も Python もクロス・プラットフォームであるということは、GIMP 用の複雑なプラグインを Python で作成し、そのプラグインをさまざまなプラットフォームで実行できるということです。

GIMP の概要

GIMP はオープンソースの画像処理プログラムであり、商用製品に代わる有力な選択肢として、多くの人々に利用されています。GIMP の特徴としては、レイヤーやパスなど複雑な機能を処理することができる点、多数の異なる画像フォーマットをサポートしている点、また比較的複雑なフィルターを備えている点が挙げられます。GIMP は活発なコミュニティーによって強力にサポートされているため、通常は GIMP の使用方法や拡張方法についての情報を容易に得ることができます。

GIMP をダウンロードしてインストールする方法については、「参考文献」を参照してください。


Python スクリプトの概要

Python はオブジェクト指向のスクリプト言語であり、Python を使用すると多くの異なるプラットフォームで実行可能なコードを作成することができます。Python は .NET 仮想マシンと Java 仮想マシンにも実装されているため、さまざまな方法で Python を実行することができます。Python をインストールする方法については、「参考文献」を参照してください。

Python 用のモジュールは数多く存在しており、皆さん自身で新たにモジュールを作成しなくても、既存モジュールの機能を再利用することができます (その一例が GIMP-Python モジュールです)。Python モジュールの索引には作成済みの多種多様なモジュールがまとめられており、それらのモジュールを使用することで、HTML (HyperText Markup Language) の処理や HTTP (HyperText Transfer Protocol) による接続処理から XML (eXtensible Markup Language) ファイルの操作に至るまで、さまざまなタスクを実行することができます (「参考文献」を参照)。また、皆さんが独自に Python モジュールを作成し、そのコードの一部を社内で再利用することもできます。

GIMP と同様、Python も活発なコミュニティーによってサポートされています。これはつまり、Python での開発に役立つ情報や比較的成熟したツールを見つけることやダウンロードして使用することができるということです。

この記事を読み進める前に、Python のサイトの説明に従って、皆さんがお使いのオペレーティング・システム上に Python をインストールしてください。Python が適切にインストールされたかどうかを確認するためには、コマンド・プロンプトを開き、「python --version」と入力します。すると、リスト 1 のような結果が表示されるはずです。

リスト 1. Python がインストールされていることを確認する
$ python --version
Python 2.6.6

Python インタープリターをインストールすると、任意のテキスト・エディターで Python ファイルを作成し、そのファイルを Python インタープリターによって実行できるようになります。Eclipse で PyDev プラグインを使用すれば、構文強調機能の他にも構文エラーの検出機能をはじめとするいくつもの機能を使用できるようになります。また、別の選択肢として Eclipse で Python コンソールを直接使用する方法もあります。この方法は、ヘルプで検索を行うには便利です。

また、GIMP-Python モジュールが、新しいバージョンの GIMP と共にインストールされている必要があります。インストールされているかどうかを確認するためには、GIMP を開き、「Filters (フィルタ)」メニューの選択肢に「Python-Fu」があるかどうかを調べます。「Python-Fu」があれば、スクリプトを作成する準備が整ったことになります。「Python-Fu」が表示されない場合は、「参考文献」セクションのリンクを辿って GIMP 用の Python 拡張機能をインストールします。

Eclipse 用の PyDev プラグインを利用したい場合は、以下のステップに従います。

  1. 「Help (ヘルプ)」 > 「Install New Software (新規ソフトウェアのインストール)」の順に選択し、PyDev プラグインをインストールします。
  2. 更新サイトとしては http://pydev.org/updates を使用します (「参考文献」を参照)。
  3. 残りのインストール手順を実行し、終了したら Eclipse を再起動します。
  4. Eclipse を再起動したら、「File (ファイル)」 > 「New (新規)」 > 「Project (プロジェクト)」の順に選択し、新しいプロジェクトを作成します。
  5. PyDev\PyDev Project (PyDev\PyDev プロジェクト)」を選択し、「Next (次へ)」をクリックします。
  6. プロジェクトの名前を入力します (例えば「MyPythonGimpPlugins」など)。
  7. Use default (デフォルトを使用)」チェック・ボックスのチェックを外し、GIMP 用の Python プラグインがあるディレクトリーを入力します (図 1)。
    図 1. Eclipse 用の PyDev プラグインを使用して、新しいプロジェクトを作成する
    このスクリーン・ショットは「MyPythonGimpPlugins」プロジェクトを作成する画面を示しています。「Project type (プロジェクト・タイプ)」には「Python」が、「Grammar Version (文法バージョン)」には「2.6」が、「Interpreter (インタープリター)」には「Default (デフォルト)」が選択されています。
  8. リンクをクリックしてインタープリターを構成します。Python が適切にインストールされていてパス上にあれば、「Auto Config (自動構成)」ボタンが機能するはずです。

GIMP Python モジュールである gimp および gimpfu を含んだディレクトリーを、このプロジェクト用に追加する必要があります。「Project (プロジェクト)」 > 「Properties (プロパティー)」の順に選択し、図 2 に示すようにこのディレクトリーを Eclipse プロジェクトに追加します (ただしベース・パスに追加してはいけません)。

図 2. GIMP-Python モジュールのディレクトリーを Eclipse のプロジェクトに追加する
このスクリーン・ショットは Eclipse で「PyDev - PYTHONPATH」に「/usr/lib/gimp/2.0/python」が追加された画面を示しています。

PyDev - PYTHONPATH」をクリックします。次に、「External Libraries (外部ライブラリー)」タブを選択して「Add source folder (ソース・フォルダーの追加)」ボタンをクリックし、GIMP Python モジュールがインストールされているフォルダーを追加します。そのパスは「/usr/lib/gimp/2.0/python/」のようになります。

Eclipse で Python コンソールを実行することもできます。そのためには、「Console (コンソール)」ビューでコンソールの一覧から「Pydev Console (Pydev コンソール)」を選択します。


スクリプトを登録する

Python ファイルを配置する場所は、ユーザーのホーム・ディレクトリーの GIMP フォルダーです。Mac および Linux システムでは、そのフォルダーは ~/.gimp-2.6/plug-ins です。標準的なスクリプト宣言と同様に、Python スクリプト・ファイルも実行可能でなければならず、Python インタープリターは最初の行になければなりません (リスト 2)。

リスト 2. 「Hello, world!」を出力する基本的な Python スクリプト
#!/usr/bin/python

print "Hello, world!"

このプラグインが GIMP メニューの 1 つとして表示されるように、Python スクリプトを GIMP に登録する必要があります。リスト 3 に、GIMP にスクリプトを登録するために最低限必要となるスクリプトを示します。このスクリプトを呼び出すと、コンソールに「Hello, world!」と出力されます。

リスト 3. GIMP にプラグインを登録する
#!/usr/bin/python

from gimpfu import *

def plugin_main(timg, tdrawable):
    print "Hello, world!"

register(
        "python_fu_resize",
        "Saves the image at a maximum width and height",
        "Saves the image at a maximum width and height",
        "Nathan A. Good",
        "Nathan A. Good",
        "2010",
        "<Image>/Image/Resize to max...",
        "RGB*, GRAY*",
        [],
        [],
        plugin_main)

main()

register() メソッドはプラグインに関する情報を GIMP に登録します。

register() メソッドにはパラメーターがいくつかあり、これらのパラメーターにより、メニューにプラグインの選択肢をどのように表示するのか、そのプラグインがメニューから起動されたときにどの Python メソッドを呼び出すのかを GIMP に指示します。表 1 に register() メソッドのパラメーターを示します。

表 1. register() メソッドのパラメーターと入力例
パラメーター入力例説明
proc_namepython_fu_resizeコマンドラインまたはスクリプトから呼び出す場合のコマンドの名前
blurbSaves the image at a maximum width and height (最大幅と最大高で画像を保存する)プロシージャブラウザに表示されるプラグインに関する情報
helpSaves the image at a maximum width and height (最大幅と最大高で画像を保存する)プラグインのヘルプ
authorNathan A. Goodプラグインの作成者
copyrightNathan A. Goodプラグインの著作権保有者 (通常は author と同じ)
date2010著作権の日付
label<Image>/Image/Resize to max...メニューの中でプラグインに使用されるラベル
imagetypesRGB*, GRAY*プラグインで処理する対象となる画像のタイプ
params[]プラグインのメソッドのパラメーター
results[]プラグインのメソッドの結果
functionplugin_mainPython コードの中で呼び出す際に使用されるメソッドの名前

register メソッドのパラメーターに関する最新情報を得るためには、「Python-Fu」コンソールを開き (「Filters (フィルタ)」 > 「Python-Fu」 > 「Console (コンソール)」の順にクリックします)、リスト 4 のコマンドを入力します。

リスト 4. Python コンソールを使用してヘルプを表示する
import gimpfu 
help(gimfu.register)

register メソッドに値を入力したら、スクリプトを保存します。スクリプトは必ず実行形式にし、.gimp2-6/plug-ins フォルダーに配置します。

スクリプトを保存したら、コマンドラインから gimp コマンドを使用して GIMP を起動します。GIMP が起動されると、このプラグインによって出力される情報がすべて表示されるはずです。この表示には、print 文の出力も含まれます。また、プラグインにエラーが含まれている場合には、それらのエラーも表示されるはずです。

GIMP が起動した状態で「Image (画像)」メニューを見ると、新しいメニュー項目として「Resize to max (最大にリサイズ)」が含まれていることがわかります (図 3)。

図 3. プラグイン用の新しいメニュー項目
このスクリーン・ショットには、GIMP の「Image (画像)」メニューの一番下に「Resize to max… (最大にリサイズ)」というメニュー項目が表示されています。

これでプラグイン自体が GIMP に適切に登録され、このプラグイン用のメニュー項目をクリックできるようになりました。次は、画像をリサイズする Python コードを追加する方法について説明します。


画像をリサイズするスクリプトを作成する

Python プラグインを GIMP に登録すると、そのプラグインのコードの中にある plugin_main メソッドに実際のコードを追加することができます。

リスト 5 に画像をリサイズするコードを示します。

リスト 5. plugin_main メソッドにコードを追加する
def plugin_main(timg, tdrawable, maxh=500, maxw=500):

    currentWidth = tdrawable.width
    currentHeight = tdrawable.height
    
    newWidth = currentWidth
    newHeight = currentHeight
            
    if (maxw < newWidth):
        newWidth = maxw
        newHeight = (float(currentHeight) / (float(currentWidth) / newWidth))
        
    if (maxh < newHeight):
        newHeight = maxh
        newWidth = (float(currentWidth) / (float(currentHeight) / newHeight))
        
    pdb.gimp_image_scale(timg, newWidth, newHeight)

この Python コードは、拡大/縮小した画像がどんな大きさでなければならないかを調べるために基本的な計算をいくつか行った後で、単純に pdb.gimp_image_scale メソッドを呼び出して画像をリサイズします。ユーザーがボックスに入力した値が画像のサイズとなるので、スクリプトでは現在入力されている画像の幅と高さをチェックし、画像の大きさを制限する必要があるかどうかを調べる必要があります。画像の幅と高さのいずれかの値が最大値を超えている場合には、スクリプトはその値を最大値と同じ値になるように設定し直し、それを基にもう一方の (幅または高さの) 値を計算します。

Python スクリプトの中で呼び出し可能な他のメソッドについて知りたい場合には、GIMP の中で「Help (ヘルプ)」 > 「Procedure Browser (プロシージャブラウザ)」の順に選択した画面を表示します。図 4 に、プロシージャブラウザで pdb.gimp_image_scale メソッドを表示した場合を示します。

図 4. プロシージャブラウザで gimp-image-scale メソッドを表示する
このスクリーン・ショットには左側にプロシージャの一覧が表示されており、「gimp-image-scale」が選択されています。また右側には選択されたプロシージャの詳細が表示されています。

リサイズ用のプラグイン・スクリプトを実行する

リサイズを実行するコードを追加したら、GIMP で画像を開きます。「Image (画像)」 > 「Resize to max (最大にリサイズ)」の順に新しいメニュー項目をクリックします。するとスクリプトはサイズを入力するように促します (図 5)。

図 5. プラグインの入力パラメーター
このスクリーン・ショットには「python_fu_resize」のパラメーター・ウィンドウが表示されており、「Maximum width (最大幅)」と「Maximum height (最大高)」には共に「500」が入力されています。

OK」をクリックすると、plugin_main メソッドが実行され、スクリプトによって画像がリサイズされます。


画像を変換するスクリプトを作成する

プラグインによって画像をリサイズできるようになったので、さらに Python スクリプトを更新することによって画像を別のフォーマットで保存することも可能になります。つまり、元の画像をある大きさに収まるようにリサイズし、JPEG ファイルとして保存することができるということです。

スクリプトに新たに追加した部分をリスト 6 に示します。

リスト 6. 元の画像を JPEG で保存するためのコードを追加する
#!/usr/bin/python

from gimpfu import *

def plugin_main(timg, tdrawable, maxh=500, maxw=500, savecopy=TRUE):

    currentWidth = tdrawable.width
    currentHeight = tdrawable.height
    
    newWidth = currentWidth
    newHeight = currentHeight
            
    if (maxw > newWidth):
        newWidth = maxw
        newHeight = (float(currentHeight) / (float(currentWidth) / newWidth))
        
    if (maxh > newHeight):
        newHeight = maxh
        newWidth = (float(currentWidth) / (float(currentHeight) / newHeight))
        
    pdb.gimp_image_scale(timg, newWidth, newHeight)
 
    if savecopy:
        pdb.file_jpeg_save(timg, tdrawable, timg.name+".jpg", timg.name+".jpg", 
                           0.9, 0, 0, 0, "", 0, 0, 0, 0)

register(
        "python_fu_resize",
        "Saves the image at a maximum width and height",
        "Saves the image at a maximum width and height",
        "Nathan A. Good",
        "Nathan A. Good",
        "2010",
        "<Image>/Image/Resize to max...",
        "RGB*, GRAY*",
        [
                (PF_INT, "max_width", "Maximum Width", 500),
                (PF_INT, "max_height", "Maximum Height", 500),
                (PF_BOOL, "copy", "Make a JPEG copy", TRUE),
        ],
        [],
        plugin_main)

main()

使用するメソッドの名前は、プロシージャデータベース (pdb 変数) から取得することができます。それには GIMP の「Help (ヘルプ)」 > 「Procedure Browser (プロシージャブラウザ)」を使用します (図 6)。

図 6. 画像を JPEG で保存するためのメソッドをプロシージャブラウザで参照する
このスクリーン・ショットには左側にプロシージャの一覧が表示されており、「file-jpeg-save」が選択されています。また右側には選択されたプロシージャに関する情報として、パラメーターの一覧、それらのパラメーターの型と用途などが表示されています。

パラメーターの入力として使用される定数は、gimpfu ライブラリーから取得することができます。利用可能な定数の一覧を表示するためには、GIMP または Eclipse の Python コンソールで、リスト 7 のコマンドを入力します。

リスト 7. gimpfu 定数に関するヘルプを表示する
import gimpfu
help(gimpfu)

これらの定数は PF_ で始まり、入力フォームのコントロールで使用されるデータ型を定義しています。


更新されたプラグイン・スクリプトを実行する

画像を JPEG で保存するための新しいコードを Python スクリプトに追加する作業が終わると、このプラグインを実行することができます。そのためには GIMP で画像を開き、「Image (画像)」 > 「Resize to max (最大にリサイズ)」の順にメニュー項目を選択します。すると更新されたパラメーター入力ボックスが表示されます (図 7)。

図 7. 更新されたパラメーター入力
このスクリーン・ショットには「python_fu_resize」パラメーターのウィンドウが表示されており、「Maximum Width (最大幅)」と「Maximum Height (最大高)」を入力するためのボックスの他に、新しいボタンとして「Make a JPEG copy (JPEG コピーを作成)」が追加されています。

これでスクリプトが完成し、いくつかの画像でテスト済みなので、次にこのプラグインをフォルダー内のすべての画像に対して実行することができます。


フォルダーに対してリサイズと保存の両方の操作を実行する

GIMP には非対話型のバッチ・モードがあり、コマンドラインから GIMP コマンドを実行することができます。コマンドライン機能を利用すると、標準的なワイルドカードを使用してフォルダー内のすべての画像を操作することができます。

例えば、画像を JPEG として保存するためのメソッドを、GIMP のバッチ・モードに直接渡すことができます。そのためには、リスト 8 のコマンドを使用します。

リスト 8. GIMP の非対話型バッチ・モードを使用して画像を保存する
gimp -i -b '(file-jpeg-save "Menu_006.png" 200 200 TRUE)' -b '(gimp-quit 0)'

しかし、このコマンドでは画像の大きさを制限するために必要な計算をするのが少し難しくなります。そこで、先ほどのプラグインを使用すれば、リサイズと保存の両方の操作は大幅に単純化され、1 つの GIMP コマンドで両方の操作を呼び出せるようになります。

このプラグインは既に動作し、GIMP に登録されているため、GIMP のプロシージャデータベースの中にこのプラグイン用のコマンドが登録されています。このプラグイン用のコマンドを表示するためには、プロシージャブラウザ (GIMP で「Help (ヘルプ)」 > 「Procedure Browser (プロシージャブラウザ)」の順に選択) にプラグインの名前を入力します。例えば、先ほどのリスト 6 のように register メソッドでプラグインの名前を「python_fu_resize」とした場合には、そのプラグインは GIMP のプロシージャブラウザに「python-fu-resize」と表示されます。このコマンドは GIMP のプロシージャブラウザに表示されている名前でコマンドラインから呼び出します。そのためには gimp コマンドと -i -b フラグを使用します (リスト 9)。

リスト 9. GIMP の非対話型バッチ・モードでプラグインを呼び出す
gimp -i -b '(python-fu-resize "myimage.png" 200 200 TRUE)' -b '(gimp-quit 0)'

GIMP は指定された画像を開き、指定されたパラメーターを使用してコマンドを実行し、コマンドの実行が完了したら終了しますが、元の画像に加えられた変更は保存されません。非対話型バッチ・モードで GIMP コマンドを使用することで、フォルダー内のすべての画像に対する大規模な変更をスクリプト化することができます。

リスト 10 のコマンドは、フォルダー内にあるすべての PNG (Portable Network Graphics) 画像に対し、この新しいプラグインのコマンドを実行します。

リスト 10. フォルダー内にあるすべての画像に対して GIMP からプラグインを呼び出す
gimp -i -b '(python-fu-resize "*.png" 200 200 TRUE)' -b '(gimp-quit 0)'

まとめ

Python はオブジェクト指向スクリプト言語であり、Python で作成したスクリプトは Linux や Mac、Windows など、さまざまなプラットフォームで実行することができます。Python スクリプト言語をサポートするツールは、テキスト・エディターにおける簡単な構文強調表示から Eclipse プラグインまで、広範にわたります。

GIMP は、さまざまなプラットフォーム上でグラフィックス・ファイルの高度な編集を実行できるアプリケーションです。GIMP でサポートしているプラグインの概念は、拡張ポイントを提供しており、この拡張ポイントを利用することで、非常に複雑なタスクでさえもスクリプトを使って自動化することができます。GIMP のプラグインでは Python スクリプトをサポートしているため、Python を使用して GIMP を拡張することができます。また、非対話型バッチ・モードを使用すると、スクリプトに適したメソッド内で、コマンドラインからプラグインを呼び出すことができます。

参考文献

学ぶために

製品や技術を入手するために

  • Python インタープリターを入手してください。Python インタープリターにより、コンピューター上で Python スクリプトを実行することができます。
  • IDE で Python コードを作成するために、まず Eclipse IDE を試してみてください。
  • Eclipse 用の PyDev プラグインをダウンロードし、Eclipse IDE で Python コードを作成してください。
  • オープンソースの画像処理プログラムである GIMP をダウンロードしてください。
  • IBM 製品の評価版をダウンロードするか、あるいは IBM SOA Sandbox のオンライン試用版で、DB2®、Lotus®、Rational®、Tivoli®、WebSphere® などが提供するアプリケーション開発ツールやミドルウェア製品を試してみてください。

議論するために

  • developerWorks コミュニティーで開発者向けのブログ、フォーラム、グループ、ウィキなどを利用しながら、他の developerWorks ユーザーとやり取りしてください。
  • Eclipse newsgroupsには、Eclipse を利用し、拡張することに関心を持つ人のために、多数のリソースが用意されています。

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Open source
ArticleID=650386
ArticleTitle=Python を使用して GIMP 用のプラグインを作成する
publish-date=03292011