アストラルプリズム

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

GIMPでダイアログから縦書きテキストレイヤーを追加するプラグイン

入力ウィンドウに文章を入力し追加するプラグイン
一連の作業を単純化させる手順の一つとして作った。
プラグインを起動すると文章を入力するウィンドウが表示されるので文章を入力すればテキストレイヤーが追加される。

インストール方法

以下をコピペしてファイル名をadd_tategaki_text_one.pyにしてutf-8で保存後、GIMPプラグインフォルダーに入れる。
GIMPのメニューの「レイヤー」→「add tategaki text one 」をクリックすると動作する。
プラグインフォルダーはGIMPを起動し「編集」→「設定」→「フォルダー」→「プラグイン」で確認の事。

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

def  tategaki_text_one(text):
	#一番下のレイヤーの情報取得
	image = gimp.image_list()[0]
	new_left_up_x = image.width / 8
	new_left_up_y = image.height /  8
	#フォント指定
	font = "MS Gothic"
	#源暎アンチックを使いたい人はフォントをインストール後以下の行の#を消す
	#font = "GenEi Antique Pv5 Medium"
	#テキストレイヤーを追加する
 	text_layer = pdb.gimp_text_layer_new(image, text, font, 32, 0)
	#
	#テキストレイヤーの位置指定
	text_layer.set_offsets(new_left_up_x, new_left_up_y)
	#
	#新規作成したテキストレイヤーを有効にする
	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_one",
	"add tategaki text one",
	"add tategaki text one",
	"katsumi",
	"katsumi",
 	"2022",
	"add tategaki text one",
	"",
	[
		(PF_TEXT, "text", "縦書きしたい文章を入力",""),
	],
	[],
	tategaki_text_one,
	menu = "<Image>/Layer" )

main()

GIMPで文字の縁取りをするプラグイン

手順が地味に面倒なので作った。
以前キーマクロソフトで作ったが動作が安定しないのでちゃんとGIMPプラグインで作り直した。
選択したテキストレイヤーの下に縁取りのレイヤーができる。
テキストじゃなくても透明部分があるものはすべて縁取り出来る。
この方法だと角の丸い縁取りができる。
角の角い縁取りを作る方法はこっち。

重要メモ
#アクティブレイヤーの位置取得
act_position = pdb.gimp_image_get_item_position(image,act_layer)

* インストール方法
以下をコピペしてファイル名をadd_outline_text.pyにしてutf-8で保存後、GIMPプラグインフォルダーに入れる。
GIMPのメニューの「レイヤー」→「add outline text 」をクリックすると動作する。
プラグインフォルダーはGIMPを起動し「編集」→「設定」→「フォルダー」→「プラグイン」で確認の事。

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

def add_outline_text(size):
	#一番下のレイヤーの情報取得
	image = gimp.image_list()[0]
	#アクティブレイヤーを取得
	act_layer = image.active_layer
	#選択範囲を解除
	pdb.gimp_selection_none(image)
	#レイヤーを新規作成
	name = "縁取り"
	width   = image.width
	height  = image.height
	type    = RGB_IMAGE
	opacity = 100
	mode    = NORMAL_MODE
	new_layer = gimp.Layer(image, name, width, height, type, opacity, mode)
	#アクティブレイヤーの位置取得	
	act_position = pdb.gimp_image_get_item_position(image,act_layer)
	new_position = act_position + 1
	#レイヤー位置指定
	image.add_layer(new_layer, new_position)
	# アルファチャンネルの追加
	pdb.gimp_layer_add_alpha(new_layer)
	pdb.gimp_edit_clear(new_layer)

	# 不透明な範囲を選択
	pdb.gimp_image_select_item(image, 0, act_layer)
	#選択範囲を拡大
	pdb.gimp_selection_grow(image ,size)
	#描画色で塗りつぶし
	pdb.gimp_edit_fill(new_layer, FOREGROUND_FILL)
	#選択範囲を解除
	pdb.gimp_selection_none(image)

	
register(
	"add_outline_text",
	"add outline text",
	"add outline text",
	"katsumi",
	"katsumi",
 	"2022",
	"add outline text",
	"",
	[
		(PF_INT, "size", "縁取りのサイズ", 2),
	],
	[],
	add_outline_text,
	menu = "<Image>/Layer" )

main()


参考サイト
アクティブレイヤーの取得
mendo.work

不透明な範囲を選択、塗りつぶし
qiita.com

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>/

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