Python-Fuを使って省力化

ホームページの作成方法は色々あるが、私は特に市販のソフトを使用せずにhtmlソースを直に記載する方法を採っている。微調整はcssファイルで出来るので、市販のソフトは使用していない。

かといって、いつも新規に記述しているわけではなく、ある程度のひな形を作っているが、写真のページのように画像数だけリンクを貼り付けるような作業はcgiを活用して自動化している(htmlページ上で必要な情報を入力すればソースを吐き出す)。 さらに、画像ファイルもファイル名をそろえてくれる便利機能を持っている。

ホームページソース作成cgi

ここまでは、ずいぶん前から完成していて便利になったのだが、問題は画像ファイルの整理。デジカメで撮影した画像は容量が大きいし、サイズも大きい。インデックス用の画像も作らないといけないがこれを自動化できないかとトライしていた。

GIMPには便利機能があって、自分でplug-inを作り動作させることができる。 Script-fuというSchemeベースとPythonベースのPython-fuという2種類がある。前者のほうが昔から使われているせいか、圧倒的に情報量が多い。ただScheme言語とかなりマニアックな言語(と自分は思う)なので、理解するのに苦労していた。

最近は人工知能のプログラミングでPythonが多く用いられている。シンプルな文法と豊富なライブラリが提供されていることが理由のようだ。なので、Python-Fuでさくさく..と思ったが、これがなかなか難しい。これまた情報がなかなか少ないのだ。かと言って、Python-Fuを語るほど私には知識がないので、まずは先駆者の方の記事を紹介させていたきます。

これらのページを参考にしてできあがったのが、以下のソースです(一部機能を削除していますが)。動作の流れとしては、画像のあるフォルダを指定(dirpathに収納)→dirpath内のjpgファイルを呼び出し→元画像ファイルの縦横比を維持したまま、長辺を1024に変換し保存→繰り返し となっています。

今回はサイズ変更のみを行っていますが、色々画像変換はできるようなので参考にしてみてください。

注意:本ソース使用によるトラブルの責任は負いかねますので、十分に検証してご利用ください。

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

from gimpfu import *
import os, glob

def plugin_main(dirpath):
	if not os.path.exists(dirpath):
		gimp.message("指定されたフォルダ( " + dirpath + " )は存在しません。")
		return

	for jpg_file in glob.glob(os.path.join(dirpath, "*.jpg")):
		image = pdb.gimp_file_load(jpg_file, "")
		tdrawable = pdb.gimp_image_active_drawable(image)
		now_name = pdb.gimp_image_get_filename(image)
		new_display = pdb.gimp_display_new(image)

		currentWidth = float( image.width )
		currentHeight = float ( image.height )
		width_rate = currentWidth / currentHeight

		if (width_rate >= 1.0):
			newWidth = 1024
			newHeight = 1024 / width_rate
		else:
			newHeight = 1024
			newWidth = 1024 * width_rate

		pdb.gimp_image_scale(image, newWidth, newHeight)
		pdb.gimp_file_save(image, tdrawable, now_name , now_name)
		pdb.gimp_display_delete(new_display)

register(
	"image-resize1024",
	"",
	"",
	"Yoichi Ito",
	"Yoichi Ito",
	"2019.8.11",
	"image-resize 1024px",
	"RGB*, GRAY*",
	[
		(PF_DIRNAME, "dirpath", "画像が保存されているフォルダ名", None),],
	[],
	plugin_main,
	menu="<Image>/Python-Fu")

main()

コメントを残す

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

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください