アストラルプリズム

PC、スマホ、ゲームなどの備忘録と日記

GIMPプラグインを作る際の要注意事項

簡単に言うとはまったところのメモ書き
GIMP2.10.30 Python 2.7.18

作る前に

自分が欲しいと思っている機能は他の人も欲しいと思って作っている可能性大なのでプラグインを探してみる事。

プラグインにこだわらない事も重要

プラグインは以下のような悲しい点がある
・python2
・pipでライブラリーを増やせない
GIMP内では手動で出来るのにプラグインにはできない機能がある
GIMP外から取ってきたクリップボードの情報が取得できない(手動なら可能)

なのでモノによってはGIMPのすべての機能にショートカットキーをつけれる機能とマクロソフトを組み合わせて使った方が楽。


日本語のパスが含まれる場合

# -*- coding: utf-8 -*-をしている前提で。
フォルダーのアドレスに日本語が含まれる場合

folder_path=folder_path.decode("utf-8")
p = os.path.join(folder_path,"*.jpg")
for jpg in glob.glob(p):
	image = pdb.gimp_file_load(jpg, "")
	disp = pdb.gimp_display_new(image)

ただしimage.filenameからとってsaveする場合は特に何もしなくても問題ないのでよく分からない。

save_file_name = image.filename
save_name, ext = os.path.splitext(save_file_name)
save_path = save_name + ".xcf"
pdb.gimp_file_save(image , text_layer , save_path , save_path)

gimp上のpythonコンソール上の注意

gimp上のpythonコンソールでglob.globを使う際には
スラッシュを二個つけるか

glob.glob("C:\\Users\\name\\Desktop\\新しいフォルダー\\*.jpg".decode("utf-8"))

バックスラッシュを一個つける

glob.glob("C:/Users/name/Desktop/新しいフォルダー/*.jpg".decode("utf-8"))

注意:普通のスラッシュ一個だけだとうまくいかない

glob.glob("C:\Users\name\Desktop\新しいフォルダー\*.jpg".decode("utf-8"))
結果
[]

gimppythonコンソール上だと動くがプラグインにすると動かないものがある。

from __future__ import unicode_literals, print_function
が通るがいざプラグインにしてみると動かなかった悲劇。

GIMPのアクティブなウィンドウを指定できない

検索してみたがアクティブなウィンドウを指摘できず回避方法(?)としては自分が開いたウィンドウの

disp = pdb.gimp_display_new(image)

を使うか以下のような開いているウィンドウ全部にプラグインを適用するしかないっぽい。

for image in gimp.image_list():

本文のdefの変数の順番

本文のdefの変数の順番はregisterで書いた入力ウィンドウPF_なにがしの順番にすること

def tategaki_text_save_xcf(text_number , font , font_size ,tategaki ,already_open_image , folder_path):

↓入力ウィンドウを書いた順にする

f:id:katsumi3:20220328204734p:plain
必ずこの順番に!

GIMPpythonのバージョンは2.7.8である

悲しいことにpython3ではないのである。
検索して見つけたコードを使ってみても動かない時はpython3でしか動かないモノかどうかも疑ったほうが良い

複数の画像にテキストレイヤーを指定した数だけ追加してGIMPの.xcf形式で保存するプラグイン作った

複数の画像にテキストレイヤーを指定した数だけ追加してGIMPの.xcf形式で保存するプラグイン
フォントの種類・サイズと縦書きか横書きか選べる。
元から開いてる画像にレイヤーを増やすか、フォルダーを指定して画像を開くか選べる。
テキストレイヤーの位置はランダム、4つのときだけきれいに配置される(自分が4を使おうと思ったから)。
xcfの保存先は画像があったフォルダー。場所の指定はできない。
Githabとかにファイルを置くべきなんだろうがどうも管理できる気がしない。

インストール方法

以下をコピペしてファイル名をadd_tategaki_text_save_xcf.pyにしてutf-8で保存後、GIMPプラグインフォルダーに入れる。
GIMPのメニューの「レイヤー」→「add tategaki text & save xcf」をクリックすると動作する。
プラグインフォルダーはGIMPを起動し「編集」→「設定」→「フォルダー」→「プラグイン」で確認の事。
初回のフォント指定(MSゴシック)を変更するにはプラグイン下の方の行の"MS Gothic"のところを好きなフォント名に書き換えればよい。
フォント名はGIMPでテキストボックスを選択してツールオプションの好みのフォントを設定する時の名前をコピペすればよい

#!/usr/bin/python
# -*- coding: utf-8 -*-
import random , os ,glob
from gimpfu import *

def tategaki_text_save_xcf(text_number , font , font_size ,tategaki ,already_open_image , folder_path):
	#一番下のレイヤーの情報取得
	#指定したフォルダー内のJPG画像を開いていく
	if already_open_image == False:	
		folder_path=folder_path.decode("utf-8")
		p = os.path.join(folder_path,"*.jpg")
		for jpg in glob.glob(p):
			image = pdb.gimp_file_load(jpg, "")
			disp = pdb.gimp_display_new(image)
        #開いている画像全てにテキストレイヤーをつける
	for image in gimp.image_list():
		#4の時だけきれいにテキストレイヤーを並べる。個人的な機能
		if text_number == 4:
			new_left_up_x_4 = [image.width / 8 , image.width / 8 , 5 * image.width / 8 , 5 * image.width / 8]
			new_left_up_y_4 =  [image.height /  8 , 5 * image.height / 8 , image.height / 8 , 5 * image.height / 8]
		save_file_name = image.filename
		img_file_base_name= os.path.basename(image.filename)
		img_file_name, ext = os.path.splitext(img_file_base_name)
		image.filename = img_file_name + ".xcf"
		for i in range(text_number):
			#テキストレイヤーを追加する
			text = unicode("■テキストレイヤー", "utf-8")
 			text_layer = pdb.gimp_text_layer_new(image, text, font, font_size, 0)
			#
			#テキストレイヤーの位置指定
			if text_number == 4:
				new_left_up_x = new_left_up_x_4[i]
				new_left_up_y =  new_left_up_y_4[i]
			else:
				new_left_up_x = random.randint(image.width / 4, 3 * image.width / 4)
				new_left_up_y =  random.randint(image.height / 4 , 3 * image.height / 4)
			text_layer.set_offsets(new_left_up_x, new_left_up_y)
			#
			#新規作成したテキストレイヤーを有効にする
			image.add_layer(text_layer)
			#
			#テキストレイヤーを縦書きにする。横書きにしたければ末尾の2を0にすること。
			if tategaki == True:
				pdb.gimp_text_layer_set_base_direction(text_layer,2)
			else:
				pdb.gimp_text_layer_set_base_direction(text_layer,0)
			#
			#テキストレイヤーのサイズを変更する
			text_layer_height = image.height / 4
			text_layer_width = image.width / 6
			pdb.gimp_text_layer_resize(text_layer, text_layer_width, text_layer_height)
		save_name, ext = os.path.splitext(save_file_name)
		save_path = save_name + ".xcf"
		pdb.gimp_file_save(image , text_layer , save_path , save_path)
	#開いている画像を閉じる
	for image in gimp.image_list():
		for displayID in range(1,image.ID+50):
			display=gimp._id2display(displayID)
			if isinstance(display,gimp.Display):
				break
		if not display:
			raise Exception("ビューがありません")
		gimp.delete(display)
#
register(
	"add_tategaki_text_and_save_xcf",
	"add tategaki text & save xcf",
	"add tategaki text & save xcf",
	"katsumi",
	"katsumi",
 	"2022",
	"add tategaki text & save xcf",
	"",
	[
		(PF_INT, "text_number", "テキストレイヤー数", 4),
		#源暎アンチックを使いたい人はフォントをインストール後に
		#"MS Gothic"のところを"GenEi Antique Pv5 Medium"に書き換える
		(PF_FONT , "font", "フォント", "MS Gothic"),
		(PF_INT , "font_size", "フォントサイズ", 20),
		(PF_BOOL , "tategaki", "縦書きにする", True),
		(PF_BOOL , "already_open_image", "すでに開いている画像にテキストをつける", True),
		(PF_DIRNAME , "folder_path", "フォルダーの場所をしてしてください", ""),
	],
	[],
	tategaki_text_save_xcf,
	menu = "<Image>/Layer" )
main()

最初から開いているビューの閉じ方(displayの取得)の参考
注:結局アクティブなウィンドウ(画像)を指定することはできない事が分かった
gimpchat.com

プラグインとして動かすための解説の参考
yasuo-ssi.hatenablog.com

ダイヤログの記述例
github.com

漫画フキダシの縦書きテキストを指定した数だけGIMPに追加するプラグイン

指定したフォントで指定した数のテキストボックスをランダムな位置に追加します。
縦書きか横書きか選べるようにしました。
テキストレイヤーが4の時はなんとなくきれいに並びます(自分が使いたかったので)。
GIMPで漫画を描いている人がいるのかはなはだ疑問だけど、自分が漫画用に使いたいので作りました。
テキストレイヤーの文字の先頭に■がついているのは選択して移動する際に面積がある文字があった方が楽に選択できるから。

インストール方法

以下をコピペしてファイル名をadd_tategaki_text_rand.pyにしてutf-8で保存後、GIMPプラグインフォルダーに入れる。
GIMPのメニューの「レイヤー」→「add tategaki text」をクリックすると動作する。
プラグインフォルダーはGIMPを起動し「編集」→「設定」→「フォルダー」→「プラグイン」で確認の事。
初回のフォント指定(MSゴシック)を変更するにはプラグイン下の方の行の"MS Gothic"のところを好きなフォント名に書き換えればよい。
フォント名はGIMPでテキストボックスを選択してツールオプションの好みのフォントを設定する時の名前をコピペすればよい。

#!/usr/bin/python
# -*- coding: utf-8 -*-
import random
from gimpfu import *

def  tategaki_text_rand(text_number , font , font_size , tategaki):
	#一番下のレイヤーの情報取得
	image = gimp.image_list()[0]
	if text_number == 4:
		new_left_up_x_4 = [image.width / 8 , image.width / 8 , 5 * image.width / 8 , 5 * image.width / 8]
		new_left_up_y_4 =  [image.height /  8 , 5 * image.height / 8 , image.height / 8 , 5 * image.height / 8]
	for i in range(text_number):
		#テキストレイヤーを追加する
		text = unicode("■テキストレイヤー" , "utf-8")
 		text_layer = pdb.gimp_text_layer_new(image, text, font, font_size, 0)
		#
		#テキストレイヤーの位置指定
		if text_number == 4:
			new_left_up_x = new_left_up_x_4[i]
			new_left_up_y =  new_left_up_y_4[i]
		else:
			new_left_up_x = random.randint(image.width / 4, 3 * image.width / 4)
			new_left_up_y =  random.randint(image.height / 4 , 3 * image.height / 4)
		text_layer.set_offsets(new_left_up_x, new_left_up_y)
		#
		#新規作成したテキストレイヤーを有効にする
		image.add_layer(text_layer)
		#
		#テキストレイヤーを縦書きにする。横書きにしたければ末尾の2を0にすること。
		if tategaki == True:
			pdb.gimp_text_layer_set_base_direction(text_layer,2)
		else:
			pdb.gimp_text_layer_set_base_direction(text_layer,0)
		#テキストレイヤーのサイズを変更する
		text_layer_height = image.height / 4
		text_layer_width = image.width / 6
		pdb.gimp_text_layer_resize(text_layer, text_layer_width, text_layer_height)
		#
 
register(
	"add_tategaki_text",
	"add tategaki text",
	"add tategaki text",
	"katsumi",
	"katsumi",
 	"2022",
	"add tategaki text",
	"",
	[
		(PF_INT, "text_number", "テキストレイヤー数", 4),
		#源暎アンチックを使いたい人はフォントをインストール後に
		#"MS Gothic"のところを"GenEi Antique Pv5 Medium"に書き換える
		(PF_FONT, "font", "フォント", "MS Gothic"),
		(PF_INT, "font_size", "フォントサイズ", 20),
		(PF_BOOL , "tategaki", "縦書きにする", True),
	],
	[],
	tategaki_text_rand,
	menu = "<Image>/Layer" )

main()

GIMPのプラグインのメニューの登録場所の調べ方。

GIMPプラグインを作る際にメニューに登録したいがメニューの登録場所の指定方法が分からんかった。
以下調べ方。

GIMPを起動してメニューの「ヘルプ」→「Plag-in Browser」→「ツリー表示」。
例えばレイヤーに作ったプラグインを登録したければメニューパスのLayerにあるレイヤー順序の反転をクリック。
すると右側の文章から

<Image>/Layer

と指定すればよい事が分かる。

f:id:katsumi3:20220326203136p:plain
プラグインが存在しない場所だったら・・・?

プラグインが存在しない場所(?)の場合は編集→設定→ユーザーインターフェース→言語の設定を英語にしてメニューの文字を確認するしかないのかも?
基本的には

<Image>/

のあとに場所を書くだけだから(実はこれに気が付かなかった)難しいことはそんなにないと思う。

GIMPに縦書きテキストを4つ追加するプラグイン

漫画のフキダシの文字を楽に入れたいのでGIMPに縦書きテキストを4つ追加するプラグインを作った。
単純に四つだけ追加する。

メニューのレイヤーからadd tategaki text 4をクリックで動作する。
一番下のレイヤーサイズにテキストの位置は依存する。
以下をコピペしてファイル名前をadd_tategaki_text_4.pyにしてutf-8で保存後、GIMPプラグインフォルダーに入れれば使える。
プラグインフォルダーはGIMPを起動し「編集」→「設定」→「フォルダー」→「プラグイン」で確認の事。
フォントはMSゴシックを指定してあるが変えたい人は以下のフォント指定の場所を書き換える事。
フォント名はGIMPでテキストボックスを選択してツールオプションの好みのフォントを設定する時の名前をコピペすればよい。

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

def  tategaki_text_4():
	#一番下のレイヤーの情報取得
	image = gimp.image_list()[0]
	new_left_up_x = [image.width / 8 , image.width / 8 , 5 * image.width / 8 , 5 * image.width / 8]
	new_left_up_y =  [image.height /  8 , 5 * image.height / 8 , image.height / 8 , 5 * image.height / 8]
	#フォント指定
	font = "MS Gothic"
	#源暎アンチックを使いたい人はフォントをインストール後以下の行の#を消す
	#font = "GenEi Antique Pv5 Medium"
	for i in range(4):
		#テキストレイヤーを追加する
		text = unicode("■テキストレイヤー" , "utf-8")
 		text_layer = pdb.gimp_text_layer_new(image, text, font, 32, 0)
		#
		#テキストレイヤーの位置指定
		text_layer.set_offsets(new_left_up_x[i], new_left_up_y[i])
		#
		#新規作成したテキストレイヤーを有効にする
		image.add_layer(text_layer)
		#
		#テキストレイヤーを縦書きにする
		pdb.gimp_text_layer_set_base_direction(text_layer,2)
		#
		#テキストレイヤーのサイズを変更する
		text_layer_height = image.height / 4
		text_layer_width = image.width / 6
		pdb.gimp_text_layer_resize(text_layer, text_layer_width, text_layer_height)
		#
 
register(
	"add_tategaki_text_4",
	"add tategaki text 4",
	"add tategaki text 4",
	"katsumi",
	"katsumi",
 	"2022",
	"add tategaki text 4",
	"",
	[],
	[],
	tategaki_text_4,
	menu = "<Image>/Layer" )

main()

画像を正しい順でまとめてPDF化する方法

windows10で画像をまとめてPDF化すると画像のページ順がおかしくなってしまう。
ほんのちょっとした手順で正しい順になるので丁寧にメモしておきたい。
ただしこの方法だと画像の縦横が統一されてしまう。
追記:実際のところCubePDF pageという無料のソフトなら連番かつ縦横もきちんとやってくれるのでそっち使った方がいい。

手順1

PDF化したいページ順にファイル名を連番にする。
Flexible Renamer等で名前をまとめて変換できる
forest.watch.impress.co.jp

f:id:katsumi3:20220326105803p:plain
画像ではすでに連番になったファイルを表示している

手順2

PDF化したい画像の入ったフォルダーの「名前」のところをクリックして画像が連番で並ぶようにする。

f:id:katsumi3:20220326110021p:plain
名前を連番で表示させる

手順3

PDF化したい画像を選択しウィンドウの上部の「共有」タブの「印刷」をクリック。
注意:右クリックから印刷をクリックした場合はページの順番がおかしくなる。
(逆に言えばファイル名を連番にしていなくとも、更新日時の順に並び替えれば、その順でPDF化できる)

f:id:katsumi3:20220326111010p:plain
共有タブから印刷

手順3

画像の印刷ウィンドウが出るので「プリンター」を「Microsoft Print to PDF」にして「写真をフレームに合わせる」のチェックを外す。
画像の縦横の向きを変えるには右下の「オプション」→「プリンターのプロパティ」→「印刷の向き」で変更できる。
画像の印刷ウィンドウで「印刷」をクリックするとどこに保存するか聞いてくるのでPDF化したファイルの置き場所と名前を指定して「保存」をクリックするとPDF化が始まる。
注意:基本的に品質は600×600しか選べないので他の品質でPDF化したければCubePDFなどを使用する事。
ところで東京魔人學園っていいですよね(ステマ

f:id:katsumi3:20220326112259p:plain
画像の印刷ウィンドウ

問題点

一部の画像だけ横にするとかはできない。画像の向きは一括して適用されてしまう。
修正するにはCubePDF-utilityを使用。
無償版はインストールの際に同梱された広告ソフトもインストールを促すメッセージが出るので、表示されるウィンドウをよく見てインストールする事。
www.cube-soft.jp

CubePDF-utilityの使い方
特に難しいことはない。PDFファイルを開いて回転させたいページをクリックして選択したら「右90°」か「左90°」して保存するだけ。
同梱で広告ソフトがついてるって言っても、こんな良いソフト無償でいいのか!?

f:id:katsumi3:20220326132753p:plain
ページを確認しながら回転できる。