2020年4月3日金曜日

GIMP Script-Py (5) Guide を

プログラミングに疲れると、匙を投げて、別の事をし出したりします。
冷却期間が必要! と、勝手に言い訳を作り、
何の事は無い、
また、別のものに手を染めたりもしたりして ... 。


今回がそうです。
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 件のコメント:

コメントを投稿