Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

GIMPで画像を一括でレベル補正(Python-Fu)

More than 3 years have passed since last update.

GIMPでPython-Fuを使って、特定のディレクトリにある画像ファイルを一括でレベル補正しました。スクリプトを寄せ集めで作るのに手間取ったため、メモとして残しておきます。

使い方

GIMPを起動して以下のメニューを選択します。

  • フィルター → Python-Fu → コンソール

Python コンソールが表示されます。これは普通のPythonのREPLと同じですが、GIMPのライブラリが読み込まれた状態で起動します。

※ ExcelのVBAをご存知の方はイミディエイトペインと同じようなものだと考えると分かりやすいです。

今回はスクリプトを登録しないで直接実行します。以下のコードをコピペします。

gammapath は適宜編集してください。

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という単語が見えるので、プロシージャーブラウザで検索して当たりを付けます。

gimp-scale.png

引数

リファレンスを見ても具体的にどういう数値を与えるのかよく分からない場合は、GUIと比較しながら考えます。

gimp-levels.jpg

参考

Python-Fu を起動してファイルを開く例が載っています。

今回は使いませんでしたがJPEGを指定して保存するときのパラメータの説明です。GIMPだけでなくjpeglibのソースまで調べたという労作です。

画像を一括で処理するための一連の流れについて説明した記事です。資料が少ない中、試行錯誤でスクリプトを組んだ労力は相当のものだったと推察します。

Pythonでのディレクトリやファイルの扱い方は以下を参照しました。

私がPython-Fuを使い始めた頃のツイートです。

7shi
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away