アストラルプリズム

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

GIMPのテキストボックスを全部縦書きにするプラグイン

テキストボックスをまとめて全て縦書きにするプラグイン作った。
グループになっている場合は子の部分まで縦書きにする。

インストール方法

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

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

def chenge_tategaki():
	#GIMPファイルの情報取得
	image = gimp.image_list()[0]
	#レイヤーの数とレイヤーIDを取得
	num_layers, layer_ids = pdb.gimp_image_get_layers(image)
	#選択範囲を解除
	for id in layer_ids:
		item = gimp.Item.from_id(id)
		#グループかそうでないか調べる
		group = pdb.gimp_item_is_group(item)
		if group == 1:   #グループの場合
			#子レイヤーの数とレイヤーIDを取得
			num_children, child_ids = pdb.gimp_item_get_children(item)
			for c_id in child_ids:
				#テキストレイヤーかそうでないか調べる
				item = gimp.Item.from_id(c_id)
				if pdb.gimp_item_is_text_layer(item):
					#テキストレイヤーを縦書きにする。横書きにしたければ末尾の2を0にすること。
					pdb.gimp_text_layer_set_base_direction(item,2)
		else:
			#テキストレイヤーかそうでないか調べる
			if pdb.gimp_item_is_text_layer(item):
				#テキストレイヤーを縦書きにする。横書きにしたければ末尾の2を0にすること。
				pdb.gimp_text_layer_set_base_direction(item,2)
	
register(
	"chenge_tategaki",
	"chenge tategaki",
	"chenge tategaki",
	"katsumi",
	"katsumi",
 	"2022",
	"chenge tategaki",
	"",
	[],
	[],
	chenge_tategaki,
	menu = "<Image>/Layer" )

main()

参考サイト
blawat2015.no-ip.com

GIMPのpythion-fuにパッケージを追加する(PIP)

windows10
gimp 2.10
GIMPプラグインを作るpython-fuに必要なものが入っていなくて涙したことがあるだろう(私)。
パッケージのインストール方法はどこか適当なところにフォルダーを作ってpipコマンドでインストール。
GIMPpythonは2.7なので古いバージョンじゃないと動かないことがあるので注意。
例:pygetwindow(バージョン0.01)をデスクトップのfolderというフォルダーにインストールした。

py -m pip install pygetwindow==0.0.1 -t C:\Users\aaaaaa\Desktop\folder

一旦以下のフォルダーの中身を失敗した時の為にどこかへコピーしておく
C:\Program Files\GIMP 2\lib\python2.7\site-packages
インストールしたフォルダーの中身を同フォルダーへコピーする
直接GIMPのフォルダにPIPできれば楽だけどなぜか直接できなかった「GIMP 2」のところにスペースがあるせいかも??

以下pyautoguiをGIMPに入れてみたもの。
レイヤーを指定してから起動するとテキストボックスが有効になり全角入力になる。
メニューにacutive textboxが追加される

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

def acutive_textbox():
	pyautogui.hotkey('ESC')
	#IMEのショートカットで強制的に半角にする
	pyautogui.hotkey('shift', 'nonconvert')
	#pyautogui.hotkey('ctrl', 'f10')
	#pyautogui.press('n')
	#pyautogui.press('f')
	pyautogui.press('t')
	pyautogui.hotkey('ctrl', 'r')
	pyautogui.hotkey('hanja')

	
register(
	"acutive_textbox",
	"active textbox",
	"active textbox",
	"katsumi",
	"katsumi",
 	"2022",
	"acutive textbox",
	"",
	[],
	[],
	acutive_textbox,
	menu = "<Image>" )

main()

GIMPでテキストボックスの後ろを塗りつぶすプラグインを作った

テキストレイヤーの下に指定した色でテキストレイヤーの文字の分だけ四角で塗りつぶしを作るプラグイン
漫画の翻訳や書き直し等でテキストレイヤーの下の文字を隠したい時に使う。
文字だけでは隠し切れない場合の為に一回り大きく透明なふちが着くようになっている。
また、塗りつぶしで吹き出しの端が消えないように丸く角を取れるようにした。
どこの色で塗るか?の「背景の色」はテキストレイヤー真ん中のすぐ上の色を使って塗りつぶす。

インストール方法

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

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

def add_background_fill(which_color, size):
	#開いているGIMPのファイルの情報取得
	image = gimp.image_list()[0]
	#アクティブレイヤーを取得
	act_layer = image.active_layer
	#選択範囲を解除
	pdb.gimp_selection_none(image)
		#アクティブレイヤーの位置取得	
	act_position = pdb.gimp_image_get_item_position(image,act_layer)
	new_position = act_position + 1
	#レイヤーを複製
	new_layer = pdb.gimp_layer_copy(act_layer,TRUE)
	image.add_layer(new_layer,new_position)
	#レイヤーの順番を指定
	pdb.plug_in_autocrop_layer(image,new_layer)
	name = "塗りつぶしレイヤー"
	width   = new_layer.width
	height  = new_layer.height

	new_layer.name = name

	# copyしたレイヤーの位置取得
	x0,y0 = pdb.gimp_drawable_offsets(new_layer)

	# 四角での選択範囲設定
	pdb.gimp_image_select_rectangle(image, 2, x0, y0, width, height)
	# 選択範囲の角を丸くする
	pdb.script_fu_selection_rounded_rectangle(image, new_layer, size, 0)  
	if which_color == "background":
		#背景色で塗りつぶし
		pdb.gimp_edit_fill(new_layer, BACKGROUND_FILL)
	elif which_color == "foreground":
		#前景色で塗りつぶし
		pdb.gimp_edit_fill(new_layer, FOREGROUND_FILL)
	else:
		#一番下のレイヤーの情報取得
		last_layer = image.layers[-1]
		#指定した場所の色を取得
		new_color = pdb.gimp_color_picker(image,last_layer,x0 + act_layer.width / 2,y0+1,TRUE,FALSE,1)
		#前景色を保存
		old_color = pdb.gimp_context_get_foreground()
		#指定した場所の色を前景色にする
		pdb.gimp_context_set_foreground(new_color)
		#前景色で塗りつぶし
		pdb.gimp_edit_fill(new_layer, FOREGROUND_FILL)
		#前景色を元の色に戻す
		pdb.gimp_context_set_foreground(old_color)
	#レイヤーサイズを1.3倍に変更
	pdb.gimp_layer_resize(new_layer,width*1.3,height*1.3,width*0.3/2,height*0.3/2)
	#選択範囲を解除
	pdb.gimp_selection_none(image)

	
register(
	"add_background_fill",
	"add background fill",
	"add background fill",
	"katsumi",
	"katsumi",
 	"2022",
	"add background fill",
	"",
	[
		(PF_RADIO, "which_color", "どこの色で塗るか?", "background",
          			(("前景色","foreground"), ( "背景色","background"),("背景の色","new_space_color"))),
		(PF_INT, "size", "角を丸めるサイズ", 10),
	],
	[],
	add_background_fill,
	menu = "<Image>/Layer" )

main()

GIMPでフォント選択を楽にする方法

GIMPよ、なぜお前はこんなにも面倒臭いのだ……!?

GIMP2.10.3
Windows10

とにかくGIMPのフォントの周りの操作(それだけじゃないが(^^;))がいちいち面倒なのだ・・・!!
そこで色々楽になる方法を書いておく。

フォントを日本語表示にする

まずフォント名が日本語で表示されない(環境による?)。
これで大体のやる気がそがれるので直そう。

f:id:katsumi3:20220415233641p:plain
いきなり心を折ってくる仕様

Windowsマーク右クリック→システム→右側の窓の「システムの詳細設定」→システムのプロパティウィンドウの「詳細設定」タブの下部にある「環境設定」クリック。
環境変数ウィンドウのユーザー環境変数で新規をクリック。
f:id:katsumi3:20220415235001p:plain
ユーザー変数の編集のウィンドウで変数名を「LANG」、変数値を「ja.JP」にしてOKをクリック。
f:id:katsumi3:20220415235112p:plain
環境変数ウィンドウをOKをクリックして閉じる。
GIMPを開いてみるとフォントが日本語名で表示されるようになる。

f:id:katsumi3:20220415235856p:plain
母国語表示ってすばらしい

テキストボックスをクリック一発で有効にする。

フォント設定のためテキストボックスを有効にするまでレイヤークリックしてテキストボタンクリックしてテキストボックスクリックして・・・が面倒。
自作のスクリプトをランチャーに登録して使うとクリック一発でフォント設定がいじれるようになる。
katsumi3.hatenablog.com

どんな感じになるかいろんなフォントで比べたい

フォント変更するために毎回プルダウンのフォントリストをクリックするのは面倒。
ツールオプションのフォントのマークの部分にマウスカーソルを持っていってマウスの真ん中ボタンをぐるぐるするとフォントが簡単に切り替わるのでどのフォントがいいか選びやすい。

f:id:katsumi3:20220416000744p:plain
これだよ!これこれ!

使うフォントだけ表示させる

同人活動や仕事等で商用利用可のフォントだけ表示させたい、あと絶対GIMPで使わないフォントが邪魔で作業しづらい。
そんな時は使うフォントだけ別のフォルダーに入れてそこだけ表示させるようにする。
フォントフォルダーを指定してもwindowsにインストールした他のフォントも表示されちゃうので手順3以降の作業が必要。

手順1

任意の場所にフォントフォルダーを作りフォントを移動(あるいはコピペ)しておく。

手順2

GIMPメニューの「編集」→「設定」→左側の「フォルダー」→「フォント」で表示させたいフォルダーを登録しそれ以外は削除する。

手順3

C:\Program Files\GIMP 2\etc\fontsのfonts.confファイルを複製して別の名前にしておく(編集の際に失敗しても大丈夫なようにする)。

手順4

fonts.confを右クリック→プロパティ→セキュリティータブからUsersを選択して編集をクリック。
「書き込み」レ点を入れて「OK」をクリック。
f:id:katsumi3:20220416003411p:plain

手順5

適当なエディタ(メモ帳でもOK)でfonts.confを開いて27行目の

<dir>WINDOWSFONTDIR</dir>

<!--	<dir>WINDOWSFONTDIR</dir> -->

に書き換えて上書き保存。
(これでGIMPwindowsのフォントファイルを見に行かなくなるので起動も早くなる)

この際にデフォルトのフォントがWindowsフォントを使用しているとフォント名が赤文字で表示されることがあるがクリックするとすぐ直るのでまあ放置で・・・。

起動した際はいつも同じフォントを表示させる

デフォルトのフォントを指定するには
ツールオプションでデフォルトにしたいフォントを表示させておく
f:id:katsumi3:20220416010432p:plain
GIMPメニュー編集→設定→画面左ツールオプション→画面右の「終了時にツールオプションを保存する」のレ点を外し「今すぐツールオプションを保存する」をクリック。
f:id:katsumi3:20220416010627p:plain
OKをクリック

フォントウィンドを独立して表示させておく

ツールオプションだと毎回プルダウンさせるの面倒なのでフォントウィンドウを独立させておくと楽。
GIMPメニューのウィンドウ→ドッキング可能なダイアログ→フォントをクリックでウインドウが独立する。
フォント変更する際にはテキストボックスを有効にした後にフォントウィンドのフォントをクリックするとツールオプションのフォントも変更される。
f:id:katsumi3:20220416011719p:plain

GIMPの表示フォントを変える

余談だがフォントにこだわりだしたらGIMPの起動画面のフォントがなんか変(おそらく中華系のフォントになっている)で気になって毎回起動時にイライラしだすようになる(自分だけか?)
こんな事じゃ作業に集中できないので表示フォントを変える。
基本的に編集→設定→ユーザーインターフェイス下のテーマを各自変えていく
C:\Users\azusa\AppData\Roaming\GIMP\2.10にあるgtkrcというファイルの末尾に(テーマがDarkの場合)

style "gimp-dark-default-style"
{
  font_name = "Meiryo 8"
}

を付け加える。
ファイルがない場合はこの行だけのファイルを作ればいい。
styleの行がテーマでfont_nameがフォント名(英語名の名前を入力の事)で末尾の数字がフォントサイズ
上記はDarkの場合だが

Grayの場合
style "sogg-default-style"
Lightの場合
style "tlsog-default-style"
Systemの場合
style "gimp-default-style"

となる

フォントの英語名が分からない場合はNexusFontやフォトインストーラーSAKURAなどのフォント管理ソフトで確認する。
フォント管理ソフトでインストールしたはずのフォントが見当たらない場合は
C:\Users\[ユーザー名]\AppData\Local\Microsoft\Windows\Fontsにあるフォントをまとめて選択したのち右クリックで「すべてのユーザーに対してインストール」する。
GIMPを再起動してもフォントが一発で変わらない時もあるので変わらない時はGIMPを2,3回再起動すること。

gtkrcファイルの詳しい変更方法は以下のサイトが参考になった
gazocustomize.com

インストールしたフォントがフォント管理ソフトから見えなくなった時の対処法

ユーザー権限でインストールされているものはフォント管理ソフトで見えない場合があるので
C:\Users\[ユーザー名]\AppData\Local\Microsoft\Windows\Fontsにあるフォントをまとめて選択したのち右クリックで「すべてのユーザーに対してインストール」する。
参考サイト
blog.ver001.com

pythonでGIMPのテキストボックスを有効にする。

前回書いた通りGIMPのテキストボックスの編集(テキスト編集→テキストレイヤー選択→テキストボックス選択→全角/半角....やってられっか!)が面倒すぎるのでpythonでマクロを作り自動化してみた。
katsumi3.hatenablog.com
ここで言うpythonGIMPプラグインを作るpython-fuではなくて独立したpythonの事。
テキストボックスのあるレイヤーを選択してマクロを動かすとテキストボックスが有効になって全角編集ONになる。
ただしGIMP側の設定のキーボードショートカットで「キャンバスのテキスト編集」をCTRL+Rに設定してあり、IMEはshift+無変換で半角文字の設定にしてある前提。
pyautguiを使ってみたのだけど、結局ウィンドウを指定してキー入力を流し込むことはできず、指定したウィンドウをアクティブにしてキー入力するという感じになった。
作った.pywファイルをFloating Buttomのようなランチャーに登録しておけばクリック一発で起動できる(ショートカットキーを使うよりマウスクリックしたい派)。
f:id:katsumi3:20220413171911p:plain
調子にのってexeファイルも作ってみたが.pyやuwscに比べると起動が若干遅くイラッとするのでダメだった。exeファイル軽量化も試してみたが、やはり遅かった。EXEファイルにするなら常駐型でないと厳しいと思われる。

import pyautogui
import pygetwindow
import ctypes
import win32gui, sys
import time

GIMP_titles = pygetwindow.getWindowsWithTitle('GIMP')
for ti in GIMP_titles:
    if win32gui.FindWindow('gdkWindowToplevel', ti.title) != 0:
        GIMP_title = ti

GIMP_title.activate()
#以下のsleepを消すとなぜかプログラムが落ちるので消さない事
time.sleep(0.001)
for n in range(30):
    act_win = pygetwindow.getActiveWindow()
    if act_win.title == GIMP_title.title:
        print('GIMPがアクティブになりました')
        break
    time.sleep(0.1)

act_win = pygetwindow.getActiveWindow()
if act_win.title == GIMP_title.title:
    print('GIMPがアクティブでループを終わりました')
else:
    print('GIMPが非アクティブでループを終わりました')
    sys.exit(0)

print('終了')
pyautogui.hotkey('ESC')
#IMEのショートカットで強制的に半角にする
pyautogui.hotkey('shift', 'nonconvert')
#pyautogui.hotkey('ctrl', 'f10')
#pyautogui.press('n')
#pyautogui.press('f')
pyautogui.press('t')
pyautogui.hotkey('ctrl', 'r')
pyautogui.hotkey('hanja')

UWSCでGIMPのテキストボックスを有効にする

GIMPのテキストボックスを有効にするには結構めんどくさくて、例えば文字の位置を直してから文字を書き直したりサイズを変更したりを繰り返すと手間がかかる。
テキストモードにしてテキストボックスをクリックしてさらに文字を全角にしなければならない。テキストボックスを移動する際も文字の上をクリックしなければ文字移動できず面倒。
かなりの手間なので自動化してみたのだけど、結構躓いたので詳細をメモ。

キーマクロソフト比較

今回uwscを使ったがuwscは検索によると作者さんがお亡くなりになっており、今後windowsアップデートで突然使えなくなる可能性もあるので他の方法を探してみたがそれも非常に面倒だった。

autohotkey

全角半角の分岐は正しく判断できたものの、GIMPへのキー入力が入ったりはいらなかったりする現象が起きた。

mkmacro

そもそもウィンドウを指定しての入力ができなかった(アクティブなウィンドウの名前を取得後でウィンドウをアクティブにすることは可能)。それに作者さんからそろそろ更新をやめるかもというお知らせもあった。

HiMacroEX

ウィンドウを有効にする方法はあるがなぜかGIMPのウィンドウをアクティブにすることができなかった。

Pulover’s Macro Creator

使いやすいがそもそもautohotkeyをベースに作られているのでautohotkeyと結果は同じ。

autoit

全角半角キーを押すのが面倒である様子。

uwscr

uwscを再現しようとしているソフト。まだ実装されてないコマンドもあるが過去に作ったuwsファイルがそのまま使えるのはすごい。

ClickerAce

非常に簡単にマクロが作れる。ウィンドウを指定してキーマクロができる。ただし単一のソフトのみの指定になる。小さく常駐する機能がないため他のマクロと組み合わせづらい。

pyautogui

pythonの習熟が必要。ウィンドウを指定して入力ができないがアクティブなウィンドウ名を詳細に指定できる。
exe化すると遅いので.pywとして起動するのが良さげ。
後日自作した経緯を別で書く。

結論

UWSCがつかえなくなった場合autohotkeyで判断させ分岐後は別のマクロソフトのファイルでキー入力させるというまどろっこしい手段を使わなければならない。
pythonでexeファイルを作り込むのも手だが完全に個人用になってしまう。

注:GIMPのテキストボックスの移動を楽にする方法
「ツールオプション」→移動対象「レイヤー」→「アクティブレイヤーを移動」にすると透明部分をクリックしても移動ができるようになる。

UWSC

UWSCではTGL_IMEで半角か全角か判断がつくはずなんだがうまくいかなかった。
毎回半角の方にしか分岐してくれなかった。
注:キーボードショートカットで「キャンバスのテキスト編集」をCTRL+Rに設定してある

ID = GETID("GIMP","gdkWindowToplevel",-1)
CTRLWIN(ID,NORMAL)
MOUSEORG(ID, 2)
IFB GETKEYSTATE(TGL_IME)=TRUE THEN
	//全角ひらがなの場合
	SCKEY(ID,VK_ESC)
	SCKEY(ID,VK_KANJI)
	SCKEY(ID,VK_T)
	SCKEY(ID,VK_CTRL,VK_R)
	SCKEY(ID,VK_KANJI)
	MSGBOX("zennkaku")

ELSE THEN
	//半角英数の場合	
	SCKEY(ID,VK_ESC)
	SCKEY(ID,VK_T)
	SCKEY(ID,VK_CTRL,VK_R)
	SCKEY(ID,VK_KANJI)
	MSGBOX(GETKEYSTATE(TGL_IME))
ENDIF
ACW(ID)

最終的に全角半角の判断はあきらめて現在の入力方法が全角だろうが半角だろうがすべからくIMEのショートカットキーで半角英数にしてからGIMPを操作してその後全角にするという手順にした。
注:IMEショートカットキーはCRTL+F10→N→Fかshifi+無変換
shift+無変換のショートカットキー確認方法:IMEの文字アイコン右クリック→プロパティ→詳細設定→全般タブの→編集操作→使用しているIMEを選ぶ→変更)

ID = GETID("GIMP","gdkWindowToplevel",-1)
CTRLWIN(ID,NORMAL)
MOUSEORG(ID, 2)
SCKEY(ID,VK_ESC)

//ctrl+F10→N→Fの場合
//SCKEY(ID,VK_CTRL,VK_F10)
//SLEEP(0.1)
//SCKEY(ID,VK_N)
//SCKEY(ID,VK_F)

//shift+無変換の場合
SCKEY(ID,VK_SHIFT,VK_NONCONVERT)

SCKEY(ID,VK_T)
SCKEY(ID,VK_CTRL,VK_R)
SCKEY(ID,VK_KANJI)

ACW(ID)

autohotkey

半角全角の判断はできたがGIMP側にキー入力を流し込むことができなかった。
ウィンドウはアクティブにできたので他のマクロソフトと組み合わせるしか方法がない。
titile一部一致指定では画像ウィンドウがアクティブにならずid指定でようやくウィンドがアクティブになった。なかった。

#WinActivateForce
SetTitleMatchMode, 2
WinGet,gimp_id,, – GIMP
WinActivate,ahk_id %gimp_id%
While IfWinNOTActive,ahk_id %gimp_id%
{
}
Gosub, IMEGetstate
	If (vimestate=1)
		;全角ひらがなの場合
		{
		ControlSend,,{Esc},ahk_id %gimp_id%
		Send,{vkF3}
		ControlSend,,t,ahk_id %gimp_id%
		ControlSend,,^r,ahk_id %gimp_id%
		Send,{vkF3} 
		}
	else if (vimestate=0)
		;半角英数の場合
		{
		ControlSend,,{Esc},ahk_id %gimp_id%
		ControlSend,,t,ahk_id %gimp_id%
		ControlSend,,^r,ahk_id %gimp_id%
		Send,{vkF3}
		}
	WinActivate,ahk_id %gimp_id%
	return

IMEGetstate:
	SetTitleMatchMode, 2
	WinGet, vcurrentwindow,, – GIMP
	vimestate := DllCall("user32.dll\SendMessageA", "UInt", DllCall("imm32.dll\ImmGetDefaultIMEWnd", "Uint", vcurrentwindow), "UInt", 0x0283, "Int", 0x0005, "Int", 0)
	return

つ、つかれた・・・。