アストラルプリズム

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

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

つ、つかれた・・・。

UWSCのキーマクロでGIMPで角い縁取りをつける方法

以下の三つの方法でのキーマクロ。
・選択範囲の境界線を描画
・ドロップシャドウ
・テキストをパスに

「選択範囲の境界線を描画」を使う場合

出てきたウィンドウで「線スタイルを選択して描画」にチェック

ACW(GETID("GIMP","gdkWindowToplevel",-1))
KBD(VK_ESC,CLICK)

KBD(VK_SHIFT,DOWN)
KBD(VK_CTRL,DOWN)
KBD(VK_D,CLICK)
KBD(VK_SHIFT,UP)
KBD(VK_CTRL,UP)

KBD(VK_ALT,DOWN)
KBD(VK_L,CLICK)
KBD(VK_ALT,UP)

SLEEP(0.1)
KBD(VK_K,CLICK)
KBD(VK_L,CLICK)

KBD(VK_ALT,DOWN)
KBD(VK_L,CLICK)
KBD(VK_ALT,UP)

SLEEP(0.1)
KBD(VK_A,CLICK)
KBD(VK_P,CLICK)

KBD(VK_ALT,DOWN)
KBD(VK_E,CLICK)
KBD(VK_ALT,UP)

SLEEP(0.1)
KBD(VK_S,CLICK)

id=GETID("選択範囲の境界線を描画")
WHILE (STATUS(id, ST_TITLE)<>"")
SLEEP(0.01)
WEND

KBD(VK_SHIFT,DOWN)
KBD(VK_CTRL,DOWN)
KBD(VK_A,CLICK)
KBD(VK_SHIFT,UP)
KBD(VK_CTRL,UP)

「ドロップシャドウ」を使う場合

ドロップシャドウをGIMP側のショートカットでCTRL+Uする必要あり。
出てきた画面の設定(赤丸のところが線の太さを設定するところ)
f:id:katsumi3:20220402221128p:plain
プリセットに保存しとくと良い
f:id:katsumi3:20220402221317p:plain

ACW(GETID("GIMP","gdkWindowToplevel",-1))

KBD(VK_ESC,CLICK)

KBD(VK_SHIFT,DOWN)
KBD(VK_CTRL,DOWN)
KBD(VK_A,CLICK)
KBD(VK_SHIFT,UP)
KBD(VK_CTRL,UP)

KBD(VK_SHIFT,DOWN)
KBD(VK_CTRL,DOWN)
KBD(VK_D,CLICK)
KBD(VK_SHIFT,UP)
KBD(VK_CTRL,UP)

KBD(VK_ALT,DOWN)
KBD(VK_L,CLICK)
KBD(VK_ALT,UP)

SLEEP(0.1)
KBD(VK_K,CLICK)
KBD(VK_L,CLICK)

SLEEP(0.1)
KBD(VK_CTRL,DOWN)
KBD(VK_U,CLICK)
KBD(VK_CTRL,UP)

「テキストをパスに」を使う場合

「テキストをパスに」をGIMP側のショートカットでALT+Aにする必要あり。
出てきたウィンドウで「線スタイルを選択して描画」にチェック

ACW(GETID("GIMP","gdkWindowToplevel",-1))

KBD(VK_ESC,CLICK)

KBD(VK_SHIFT,DOWN)
KBD(VK_CTRL,DOWN)
KBD(VK_D,CLICK)
KBD(VK_SHIFT,UP)
KBD(VK_CTRL,UP)

KBD(VK_ALT,DOWN)
KBD(VK_L,CLICK)
KBD(VK_ALT,UP)

SLEEP(0.1)
KBD(VK_K,CLICK)
KBD(VK_L,CLICK)

KBD(VK_ALT,DOWN)
KBD(VK_L,CLICK)
KBD(VK_ALT,UP)

SLEEP(0.1)
KBD(VK_P,CLICK)

KBD(VK_ALT,DOWN)
KBD(VK_A,CLICK)
KBD(VK_ALT,UP)

GIMPでファイルを名前順に分け、かつ指定した容量ごとにフォルダーに分けるプラグイン

GIMPでやる必要あるのか?
自分が使う用事があって作った。拡張子ごとに分けれる。というか同じ拡張子ごとにしか分けれない仕様にしてしまった。
ファイル名にハイフンかアンダーバーがあればそれもファイルを分けるか選択することができる。
f:id:katsumi3:20220403195520p:plain

インストール方法

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

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

def organize_files_by_capacity(separation, cap_limit, extension, folder_path):
	if folder_path == "":
		gimp.quit()
	folder_path = folder_path.decode("utf-8")
	p = os.path.join(folder_path, "*" + extension)
	i = 1
	cap = 0	
	if not glob.glob(p):
		gimp.message("指定フォルダーに".decode("utf-8") + extension + "ファイルがありません".decode("utf-8"))
		gimp.quit()
	else:
		if separation == True:
			first_file_name = glob.glob(p)[0]
			first_file_basename = os.path.splitext(os.path.basename(first_file_name))[0]
			if "_" in first_file_basename:
				folder_name = first_file_basename.split("_")[0]
			elif "-" in first_file_basename:
				folder_name = first_file_basename.split("-")[0]
			else:
				gimp.message("-か_の区切り文字がありません".decode("utf-8"))
				gimp.quit()
			previous_folder_name = folder_name
			new_path = os.path.join(folder_path , folder_name + "_01")
		else:
			new_path = os.path.join(folder_path, "01")
		os.mkdir(new_path)
	
	for file in glob.glob(p):
		cap = cap + os.path.getsize(file)
		if separation == True:
			folder_name = os.path.splitext(os.path.basename(file))[0]
			if "_" in folder_name:
				now_folder_name = folder_name.split("_")[0]
			elif "-" in folder_name:
				now_folder_name = folder_name.split("-")[0]			
			if cap > cap_limit * 1000:
				i = i + 1
				new_path = os.path.join(folder_path, now_folder_name + "_" + str(i).zfill(2))
				os.mkdir(new_path)
				cap = os.path.getsize(file)
	
			elif previous_folder_name != now_folder_name:
				gimp.message("folder_name = "+ folder_name)
				gimp.message("previous_folder_name = "+ previous_folder_name)
				i = 1
				new_path = os.path.join(folder_path, now_folder_name + "_" + str(i).zfill(2))
				os.mkdir(new_path)
				cap = os.path.getsize(file)

			previous_folder_name = now_folder_name
			
		else:
			if cap > cap_limit*1000:
				i = i + 1
				new_path = os.path.join(folder_path,str(i).zfill(2))
				os.mkdir(new_path)
				cap = os.path.getsize(file)
		
		shutil.move(file,os.path.join(new_path,os.path.basename(file)))


register(
	"organize_files_by_capacity",
	"organize files by capacity",
	"organize files by capacity",
	"katsumi",
	"katsumi",
 	"2022",
	"organize files by capacity",
	"",
	[
		(PF_BOOL, "separation", "-や_で区切られた名前ごとにフォルダーを分ける", True),		
		(PF_INT, "cap_limit", "何容量(kb)でまとめるか?",10000 ),
		(PF_TEXT, "extension", "拡張子を入力",".jpg"),
		(PF_DIRNAME, "folder_path", "フォルダーの場所を指定してください", ""),
	],
	[],
	organize_files_by_capacity,
	menu = "<Image>/File/Open" )
main()

googleで画像ファイルからまとめて文字起こし(OCR)する方法。

Googleドライブに保存した画像をgoogleドキュメントで開くと画像に移されている文字が文字起こし(OCR)される。
googleドライブ→画像を選択→右クリック→アプリで開く→Googleドキュメント)
すごい機能なのだが画像一枚づつしかできないので面倒である。

まとめてやるには画像を複数枚まとめてPDF化してGoogleドキュメントで読み込めばいい。
ただしPDFの容量は10Mb以下でないとダメなので注意。

枚数を増やすには画質を落としてPDF化する(当然文字の読み取りの正確さは下がる)。
Windows10でPDF化する場合600×600(600dpi)しか選べないためCubePDFなどをインストールすると容量を下げることができるが‥‥何度も言うが文字の読み取りの正確さは下がる。

自分的にお勧めなのはCubePDF Pageという無料ソフト。
画像をもとの縦横、もとの解像度でPDF保存してくれる(ただし解像度の設定自体はできない)。
大量に画像がある場合は最初から画像を10~15枚(画像サイズによる)のフォルダに分けておけば()手作業でPDF化する場合、CLRL+Aで全選択してCubePDF Pageにつっこむなどで作業を単純化できると思う。

GIMPで角の角い縁取りをする。

GIMPのメジャーな選択範囲を拡大して作る縁取り方法では角の丸い縁取りしかできない。
でも角を角くしたい時もあるのでその方法を書く。

f:id:katsumi3:20220402215122p:plain
焼き肉食べたい

角が丸くなるメジャーな縁取り方法

レイヤー→透明部分→不透明部分を選択範囲に→選択→選択範囲の拡大→レイヤーを増やす→下のレイヤの選択範囲を塗りつぶし

角が角くなる縁取り方法・その一

あらかじめレイヤーを複製→複製した下のレイヤーを選択→フィルター→照明と投影→ドロップシャドウ
画面のように設定する。縁取りの色はお好みで。
赤丸の5のところが厚みなのでここもお好みで数値を変えて。

f:id:katsumi3:20220402221128p:plain
他にいい方法はないのか

右上の小さな+マークを押すとプリセットとして値を保存していつでも使えるので登録しておくと楽。

f:id:katsumi3:20220402221317p:plain
さっそくプリセットに登録だ!

このドロップシャドウはプラグイン用のコマンドが見つからずプラグインに組み込めなかった。
ドロップシャドウ(レガシー)らしきコマンドの方見つからなかった、無念。
ただプリセットに登録しておけば作業は楽になるとは思う。

角が角くなる縁取り方法・その二

レイヤー複製
ダイヤログのテキストレイヤーを右クリック
テキストをパスに
編集→パスの境界線を描画
線の太さを設定してok

ちょっとトゲがでるが一番ちゃんと角くなる。

f:id:katsumi3:20220404005104p:plain
kofって良いですよね。

外部で選択したテキストを一発でGIMPの縦書きテキストレイヤーとして追加する方法

外部テキストをGIMPに縦書きテキストとして追加する作業を繰り返し行うのが苦痛すぎて楽になる手順を考えてみた。

概要

GIMP外でクリップボードに保存したものがプラグインとしてはGIMP内に読み込めないので(手作業では読み込めるんだけどなァ・・・)自作プラグインとマクロソフトを組み合わせて作業する。

手順1

以下をあらかじめインストールしておく

  • HiMacroEx 自分的にお気に入りのマクロソフト
  • UWSC マクロソフト(HiMacroExではGIMPのウィンドウを感知してくれなかったのでUWCSでその部分を行うことにした)
  • 自作GIMPプラグインadd tategaki text one GIMPで入力ウィンドウから縦書きテキストを入力するプラグイン

add tategaki text oneのインストール方法
GIMPでダイアログから縦書きテキストレイヤーを追加するプラグイン - アストラルプリズム

手順2

GIMP側でadd tategaki text oneにショートカットキーを割り付ける
1.メニューの編集→キーボードショートカット
2.検索窓にtategakiと入力してadd tategaki text oneを選択
3.新しいアクセラレーターをクリックしてショートカットキーを入力(CTRL+kにしたという前提で話を進める)
4.保存をクリックして閉じる

手順3

UWSC側の設定
1.UWSCの入ったのフォルダーを管理しやすいようにHiMacroEXのフォルダーに入れておく
2.以下のマクロをテキストファイルにコピペしてファイル名を「GIMPのテキスト追加ウィンドウをアクティブにする」、拡張子を.UWSにしてさっきのUWSCのフォルダーに保存する
KBD(VK_CTRL,DOWN)
KBD(VK_K,CLICK)
KBD(VK_CTRL,UP)
の部分が手順2で設定したショートカットなので変更したければそこを随時書き換え。

ACW(GETID("GIMP","gdkWindowToplevel",-1))

KBD(VK_CTRL,DOWN)
KBD(VK_K,CLICK)
KBD(VK_CTRL,UP)

ACW(GETID("python-fu-add_tategaki_text_one","gdkWindowToplevel",-1))

KBD(VK_CTRL,DOWN)
KBD(VK_A,CLICK)
KBD(VK_CTRL,UP)

KBD(VK_CTRL,DOWN)
KBD(VK_V,CLICK)
KBD(VK_CTRL,UP)

KBD(VK_ALT,DOWN)
KBD(VK_O,CLICK)
KBD(VK_ALT,UP)

3.UWSC→設定(カナヅチの絵のボタン)→ランチメニュー→ランチメニューの設定
スクリプト登録画面でウィンドウ下のhotkeyがCTRL+wであることを確認し好きなスロットを選ぶ
(ここでは二行めの「1.」のスロットを選んだ前提で話を進める)

4.スクリプト設定画面が表示されたらスクリプトファイルをクリックし2で作ったマクロファイルを登録する。
f:id:katsumi3:20220402144007p:plain

手順4

HiMacroEX側の設定
1.以下をテキストファイルにコピペして「GIMPにテキスト追加」という名前にしてHiMacroEXのMacroフォルダーに保存する。

Ctrl Down
C
Ctrl Up
Ctrl Down
W
Ctrl Up
Numpad1

使い方

1.あらかじめUWSCとHiMacroEXを起動してテキストを追加したいGIMPファイルを開いておく。
2.HiMacroEXで「GIMPにテキスト追加」を選択しておく。
3.追加したい外部テキストを選択(マウスをドラッグしなくてもクリック三回で文章の一塊が選択できる場合がある)、
4.HiMacroEXの「再生」をボタンをクリックするとGIMP側にさっきと同じ文章のテキストレイヤーができる。
追記:
HiMacroEXの設定→全般でHiMacroEXのテキストボックスを表示させなくできる
同じく設定で常に手前に表示も設定できる。