GIMPでPython-Fuを使って、特定のディレクトリにある画像ファイルを一括でレベル補正しました。スクリプトを寄せ集めで作るのに手間取ったため、メモとして残しておきます。
使い方
GIMPを起動して以下のメニューを選択します。
- フィルター → Python-Fu → コンソール
Python コンソールが表示されます。これは普通のPythonのREPLと同じですが、GIMPのライブラリが読み込まれた状態で起動します。
※ ExcelのVBAをご存知の方はイミディエイトペインと同じようなものだと考えると分かりやすいです。
今回はスクリプトを登録しないで直接実行します。以下のコードをコピペします。
※ gamma
や path
は適宜編集してください。
import os, glob
gamma = 0.3 # 0.1(濃) - 10(薄)
path = "C:\\test"
outdir = os.path.join(path, "output")
if not os.path.exists(outdir):
os.mkdir(outdir)
for jpg in glob.glob(os.path.join(path, "*.jpg")):
img = pdb.gimp_file_load(jpg, "")
disp = pdb.gimp_display_new(img)
pdb.gimp_levels(img.active_drawable, 0, 0, 232, gamma, 0, 255)
newjpg = os.path.join(outdir, os.path.basename(jpg))
pdb.gimp_file_save(img, img.active_layer, newjpg, "")
pdb.gimp_display_delete(disp)
これを張り付けてもプロンプトが ...
となり入力を要求されますが、何も入力しないで [Enter] を押すことでブロックを閉じて処理が始まります。
pdb.gimp_levels()
を別の処理に変えれば、色々と応用ができるでしょう。
処理
先ほどの例で実際にレベル補正をしているのは次の一行です。
pdb.gimp_levels(img.active_drawable, 0, 0, 232, gamma, 0, 255)
ここを置き換えれば他の処理も可能です。いくつか例を示します。
範囲選択
pdb.gimp_rect_select(img, 0, 0, 1500, 2200, 2, False, 0)
この後にレベル補正などをすれば、画像の一部だけを加工できます。
リサイズ
pdb.gimp_image_scale_full(img, 256, 256, 3)
切り抜き
pdb.gimp_image_crop(img, 1420, 2180, 130, 130)
GIFからの変換
GIFファイルを開いて横幅を揃えてJPEGファイルとして保存する例です。縦横比を維持します。色のモードをRGBに変換する必要があります。
width = 1048
for gif in glob.glob(os.path.join(path, "*.gif")):
img = pdb.gimp_file_load(gif, "")
disp = pdb.gimp_display_new(img)
pdb.gimp_image_convert_rgb(img)
pdb.gimp_image_scale_full(img, width, img.height * width / img.width, 3)
newjpg = os.path.join(outdir, os.path.basename(gif)[:-3]+"jpg")
pdb.gimp_file_save(img, img.active_layer, newjpg, "")
pdb.gimp_display_delete(disp)
開いている画像
既に開いている画像に対しての一括処理は次のようにします。
for img in gimp.image_list():
pdb.gimp_levels(img.active_drawable, 0, 0, 232, gamma, 0, 255)
コツ
Pythonの使い方ですが、オブジェクトに対して dir(pdb)
などとすることでメソッドが表示できます。これで当たりを付けてから、Pythonコンソールで「参照」ボタンをクリックすると表示されるプロシージャーブラウザで調べるという手探りができます。
※ この辺のPythonの使い勝手を多少知っていたので、Script-FuではなくPython-Fuを使いました。
関数の探し方
当たりを付けると言っても、dir()
で出て来る関数はあまりに多く、関数名から機能がすぐに思い付かないことも多いです。Excelのようにマクロの記録で取得できれば楽なのですが、そういったことはできないようです。
そこで間接的ですが、マニュアルから探す方法を紹介します。
まずお目当ての機能のページを探します。たとえば画像の拡大・縮小(リサイズ)であれば次のページです。
URLを見るとscaleという単語が見えるので、プロシージャーブラウザで検索して当たりを付けます。
引数
リファレンスを見ても具体的にどういう数値を与えるのかよく分からない場合は、GUIと比較しながら考えます。
参考
Python-Fu を起動してファイルを開く例が載っています。
今回は使いませんでしたがJPEGを指定して保存するときのパラメータの説明です。GIMPだけでなくjpeglibのソースまで調べたという労作です。
画像を一括で処理するための一連の流れについて説明した記事です。資料が少ない中、試行錯誤でスクリプトを組んだ労力は相当のものだったと推察します。
- 本の電子化を補助するためにGimpとpython-fuを使ってみた。 - Oillerの日記 2010.11.18
- 問題集からプリントを作成するためにGimpとpython-fuを使ってみた。 - Oillerの日記 2013.11.16
Pythonでのディレクトリやファイルの扱い方は以下を参照しました。
- Python: 指定したパスのディレクトリ中のファイル一覧を出力 2008.08.09
- [Python]ファイル/ディレクトリ操作 2015.12.26
私がPython-Fuを使い始めた頃のツイートです。
GIMPで複数の画像を一括でレベル補正
— 七誌 (@7shi) 2016年7月26日
フィルター→Python-Fu→コンソール
for img in gimp.image_list(): pdb.gimp_levels(https://t.co/Si5Ju30oXV_drawable,0,0,232,0.4,0,255)
GIMPで開いている画像一括で同サイズ選択(Python-Fu)
— 七誌 (@7shi) 2016年7月26日
for img in gimp.image_list(): pdb.gimp_rect_select(img,0,0,1500,2200,2,False,0)
後で[Alt]ドラッグで手動調整するのに使用