冷却期間が必要! と、勝手に言い訳を作り、
何の事は無い、
また、別のものに手を染めたりもしたりして ... 。
今回がそうです。
GIMP のスクリプティングに疲れ、
差し当たり、形になったので、
検索で見付けた、 GIMP Guide の実験をしていたのです。
GIMP の Guide の位置付けは微妙で、
設定絡みや削除の 関数 は用意されていますが、
GUI 上で手動作成したものとの 親和性 は 今ひとつ と感じています。
書けば書けない事無い! と思うのですが、
果たして、使うのか ... ?。
その判断をする為にも、 実験 は必要です。
先ずは、
既成の画像に存在する Guide を取得して見ましょう。
画像には、幾つかの Guide が既に設定されているものとします。
以下、 Console で試します。
端折って、実行可能関数の形にしました。
def python_fu_shiro_wrire_guide_CSV(img):
import os
# import csv
# Get Guides CSV File
j = 0
is_end = False
text = "C, GIMP Guides\n" + \
"C, " + img.name + "\n" + \
"I, w/h, " + str(img.width) +", " + str(img.height) + "\n"
g_typ = "A" # A:Absolute R:Relative C:Comment
while not is_end:
g_idx = pdb.gimp_image_find_next_guide(img, j)
g_ori = pdb.gimp_image_get_guide_orientation(img, g_idx)
g_pos = pdb.gimp_image_get_guide_position(img, g_idx)
text += g_typ + "," + str(g_idx) + "," + str(g_ori) + "," + str(g_pos) + "\n"
if g_idx == 1:
is_end = True
j = g_idx
if not img.filename: # is Null
pass
else:
text += "C, " + img.filename + "\n"
csv_file = os.path.expanduser('~') + "\\Pictures\\GIMP\\Temp\\XcfGuidesCsv.txt"
print(text)
with open(csv_file, "w") as f:
f.write(text)
少し、解説を入れます。
最初、CSV に吐き出す心算でしたが、
Windows の GIMP Python では、(私には)、行間に空白行が入り込むのを避けられないので、
基本の write で、ベタに書いています。
関数を、画像を引数にして、実行すると、ファイルが生成されます。
こんな内容です。
実行時、同じものが、Console に表示されていた筈です。
C, GIMP Guides
C, [名称未設定] (インポートされた画像)
I, w/h, 344, 217
A,3,1,34
A,2,1,172
A,1,0,108
C, C:\Users\UserA\Pictures\GIMP\Temp\テスト\名称未設定.png
C で始まる行は、コメント。
I で始まる行は、画像サイズ情報。
A で始まる行は、Guide 情報。 A,SeqNo,0:水平/1:垂直,左上からの距離。
上にはありませんが、
R で始まる行は、Guide 情報 も、取り扱います。
A は距離が絶対値。
R は絶対値としての値ですが、対象画像での相対的な位置と定義しましょう。
さて、別画像への Guide 自動生成を考えます。
上のファイルをこの様に書き換えます。
C, GIMP Guides
I, w/h, 1000, 1000
A,3,1,50
R,2,1,500
R,1,0,500
3行目は 50 px での垂直線、
4&5行目は 500/1000 = 50% での垂直/水平 線、 です。
編集時、I の行は、A や R の行より前に置いて下さい。
def python_fu_shiro_read_guide_CSV(img_wg):
import os
csv_file = os.path.expanduser('~') + "\\Pictures\\GIMP\\Temp\\XcfGuidesCsv.txt"
with open(csv_file, "r") as f:
s = f.read()
sline = s.splitlines()
img0w = 0
img0h = 0
for sl in sline:
if sl == "":
pass
elif sl[0] == "I":
img0w = int(sl.split(",")[2])
img0h = int(sl.split(",")[3])
elif sl[0] == "A":
guid_ori = int(sl.split(",")[2]) # 0:Horizontal 1:Vertical
guid_pos = int(sl.split(",")[3])
if guid_ori == 0:
guide = pdb.gimp_image_add_hguide(img_wg, guid_pos)
elif guid_ori == 1:
guide = pdb.gimp_image_add_vguide(img_wg, guid_pos)
elif sl[0] == "R":
guid_ori = int(sl.split(",")[2]) # 0:Horizontal 1:Vertical
guid_pos = int(sl.split(",")[3]) # Abosolute On Base Image
if guid_ori == 0:
guid_pos = int(guid_pos * img_wg.height / img0h)
guide = pdb.gimp_image_add_hguide(img_wg, guid_pos)
else:
guid_pos = int(guid_pos * img_wg.width / img0w)
guide = pdb.gimp_image_add_vguide(img_wg, guid_pos)
elif sl[0] == "C":
pass
新規画像や別画像を開き、
img_wg にその画像をセットし、このスクリプトを実行すれば、
其処に、指定の Guide 群 が新設されます。
数多くの Guide が必要だったり、
別画像の Guide のみコピーしたい場合は、重宝かも知れません。
しかし、相対的に、出番は少ないと思いますので、
スクリプトの正規の形には整えず、
Console から画像指定して実行の形に整えるだけで、
此処に公開して置きます。
使い方は
>>> # Create/OverWrite CSV File
>>> # ex. 1: Image ID
>>> img=gimp._id2image(1)
>>> python_fu_shiro_write_guide_CSV(img)
>>>
>>> # Modify CSV Data
>>>
>>> # Create Guide On The Image From CSV Inf.
>>> # ex. 2: Image ID
>>> img_wg=gimp._id2image(2)
>>> python_fu_shiro_read_guide_CSV(img_wg)
尚、
双方のスクリプトは、
個々の環境に合わせて、出力先のパスを変更して下さい。
+ "\\Pictures\\GIMP_Fv013\\Temp\\XcfGuidesCsv.txt" の部分です。
0 件のコメント:
コメントを投稿