PhotoshopのアクションみたいなGIMP Python-Fuスクリプト(開いている画像をリサイズして保存、閉じるアクション・作業自動化)

コンピュータ関連
スポンサーリンク

GIMPでもPhotoshopでいう「アクション」みたいな作業の自動化がしたかった。

具体的には、画像を開いてトーンカーブやモザイク処理などを行った後(手動)、
ブログ用にリサイズして保存する(タスクの自動化)。

複数画像を一括してリサイズするのではなく、
あくまでも手動で開いた1枚の「リサイズ&保存して閉じる」部分だけ自動化したかったのです。

スポンサーリンク

GIMPにはアクション(自動化プロセス)が無い!?

GIMPを深く使い込んでいるわけではないので、
なんとなくフォトショのアクションに似たようなものがあるんじゃないか・・・と勝手に想像していたけどどうやら無いらしい。

代わりに Script-FuPython-Fu といったスクリプトを書いて実現するみたい。
Script-FuはScheme(スキーム)というプログラム言語で書き、Python-FuはPython(パイソン)で書く、という違いがある。

Python-Fuでスクリプトを書いてみる

環境:macOS monterey、GIMP 2.10.32

書いてみる、と言っても詳しくないので
サンプルを参考にしつつ、処理の部分を自分のやりたい事に置き換えて書いてみました。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from gimpfu import *
import os

def plugin_main(image, layer):
  savepath = "/Users/me/Desktop/img/" #保存先
  image = gimp.image_list()[0]

  # 画像のリサイズ
  new_width = 1024
  new_height = int(image.height / (float(image.width) / new_width))
  pdb.gimp_image_scale(image, new_width, new_height)
  #image.scale(new_width, new_height) #built-in method

  # 画像の保存
  newjpg = os.path.join(savepath, "_" + os.path.basename(image.filename))
  pdb.gimp_file_save(image, image.active_layer, newjpg, "")

  # 閉じる
  for i in range(image.ID + 1):
    #print 'i: %d' % (i)
    display = gimp._id2display(i)
    if isinstance(display,gimp.Display):
      #print(display)
      gimp.delete(display)
      break

register(
        "python_fu_resize",      #プロシージャの名前
        "テスト",                 #プラグインの情報
        "テスト",                 #詳しいプラグインの情報
        "author",                #プラグインの著者
        "author",                #コピーライト
        "09/29 2023",            #日付
        "/Filters/Languages/Python-Fu/resize-save-action",    #メニューに表示するプラグイン名
        "",                      #画像タイプ
        [],                      #引数
        [],                      #戻り値
        plugin_main)

main()

スポンサーリンク

条件と処理の流れ

保存先のフォルダは事前に用意。
画像のサイズは横幅1024pxに合わせてリサイズ。
高さを計算する際に小数点以下切り捨てになってしまい、縦横比のズレが大きいので float() を付けて計算したのちに int() で整数に。

※gimp_image_scaleを使うときは整数でなくても大丈夫。built-in methodの image.scale を使う際には整数型にしないとエラーがでました。

ファイル名の先頭に”_”(アンダースコア)を付けて保存。

画像を開くたびに画像のID(image.ID)は数が増えていくのですが、
表示に使われる display の数値は必ずしも画像のIDと一致しません。

現在使用している display の数値がわからないと閉じようにも閉じられないので、もう力技で1から数えて探ってます。
一致したら gimp.delete(display) に渡して閉じます。

メニューの

フィルター > Python-Fu > resize-save-action

に項目として出るようにしました。

ちなみに画像ファイルを一つ開いて編集・調整することが前提。
複数ファイルを一括処理するようにはしていません。

プラグインフォルダに保存、パス通し

拡張子 .py を付けて保存します。

python_fu_resize.py

既存のプラグインフォルダに入れるか、
自前で用意したフォルダに放り込みます。

バックアップをとるのに楽なので今回は自前のフォルダにしました。
設定からパスを通しておきます。

plugin folder

実行権限を付与

実行権限がないとプラグインとして動いてくれないので権限を付与します。

保存先でターミナルを開き、

chmod +x python_fu_resize.py 

のように実行

スポンサーリンク

まとめ

なんとかやりたかったことは実現できました。

けっこう試行錯誤しましたけど。

特に画像を閉じる部分においては正直面倒臭かった。
ユーザーが開いた画像はスクリプトで閉じることは出来ない的な情報もあったりして・・・。

まぁ結果的にはなんとかなったので良かった。

コメント

タイトルとURLをコピーしました