mieki256's diary



2012/08/06(月) [n年前の日記]

#1 [gimp] GIMP 2.8上でPython-fuを勉強中

以下のページを参考にしながら勉強中。

_Get sublayers from group layer with Python in Gimp - Stack Overflow
_マクロで始める実用プログラミング - Part3 フリーの画像ソフトGIMPをPythonで自在に操る:ITpro
_python-fuを使った画像レイヤ情報の取得方法 - 風日記

# 最初に必要?

>>> from gimpfu import *

# GIMPのバージョンを取得

>>> version = pdb.gimp_version()
>>> version
'2.8.0'

# 現在GIMPで開いている画像のリストを得る

>>> gimp.image_list()
[<gimp.Image 'test.xcf'>]

# 1番目の画像情報?を取得

>>> image = gimp.image_list()[0]
>>> image
<gimp.Image 'test.xcf'>

# 画像内の全レイヤーの一覧を、おそらくは Item と呼ばれる情報の形で取得

>>> image.layers
[<gimp.GroupLayer 'レイヤーグループ'>, <gimp.Layer 'レイヤー'>, <gimp.Layer '背景'>]

# レイヤー枚数とレイヤーIDのリスト、の形でも取得できる
# レイヤーIDと、Item情報は、異なる情報らしい。

>>> num_layers, layer_ids = pdb.gimp_image_get_layers(image)
>>> num_layers
3
>>> layer_ids
(5, 10, 11)

# gimp.Item.from_id(ID番号) で、Item 情報を取得できるっぽい?
# GIMP 2.8 ではコレが使えるけど、GIMP 2.6 ではエラーになる。

>>> item = gimp.Item.from_id(layer_ids[0])
>>> item
<gimp.Layer 'レイヤーグループ'>

# そのレイヤーが、レイヤーグループなのか調べる
# 1 ならレイヤーグループ。0 なら通常レイヤー。

>>> group = pdb.gimp_item_is_group(item)
>>> group
1

# レイヤーグループには子供レイヤーが居る。
# pdb.gimp_item_get_children(item) で、レイヤー枚数とIDリストを得られる。

>>> num_children, child_ids = pdb.gimp_item_get_children(item)
>>> num_children
3
>>> child_ids
(6, 8, 9)

# 子供レイヤーの1番上を取得

>>> item = gimp.Item.from_id(child_ids[0])
>>> item
<gimp.Layer 'TEXT LAYER'>

# レイヤーグループか調べる

>>> pdb.gimp_item_is_group(item)
0

# 子供レイヤーの2番目を取得

>>> item = gimp.Item.from_id(child_ids[1])

# 指定したレイヤーをアクティブに

>>> pdb.gimp_image_set_active_layer(image, item)

# 現在アクティブになっているレイヤーの、
# レイヤー名、左上座標、幅、高さ、を取得

>>> pdb.gimp_layer_get_name(item)
'\xe3\x83\xac\xe3\x82\xa4\xe3\x83\xa4\xe3\x83\xbc #2-with-dropshadow'
>>> pdb.gimp_drawable_offsets(item)
(269, 60)
>>> pdb.gimp_drawable_width(item)
160
>>> pdb.gimp_drawable_height(item)
222

# Python-fu なら、もっと簡単に、
# レイヤー名、左上座標、幅、高さを取得できるらしい…?

>>> layers = image.layers
>>> layers
[<gimp.GroupLayer 'レイヤーグループ'>, <gimp.Layer 'レイヤー'>, <gimp.Layer '背景'>]
>>> layers[1].name
'\xe3\x83\xac\xe3\x82\xa4\xe3\x83\xa4\xe3\x83\xbc'
>>> layers[2].name
'\xe8\x83\x8c\xe6\x99\xaf'
>>> layers[1].offsets
(0, 0)
>>> layers[2].offsets
(0, 0)
>>> layers[2].width
512
>>> layers[2].height
512

もしかすると、バージョンチェックは以下でできるかもしれず?
>>> pdb.gimp_version()
'2.8.0'
>>> pdb.gimp_version().startswith("2.4.")
False
>>> pdb.gimp_version().startswith("2.6.")
False
>>> pdb.gimp_version().startswith("2.8.")
True
しかし、Python の仕様によっては上手くいかないかも。その行を通過しなくても、存在しない関数名がスクリプト中に書いてあるだけでエラーを出すなら、2.6と2.8で共用できるスクリプトを書くのは難しいかもしれない。そのあたりどういう仕様になってるかわからんけど。

ダイアログの指定時に、複数の選択肢の中から1つ選ぶ、という入力欄を使いたいのだけど…。Script-fu なら SF-OPTION だから、おそらく Python-fu では PF_OPTION になるのだろう。と思ったけど、 _GIMP Python Documentation には書いてない…。

_No PF_OPTION in Python-fu?? に、PF_OPTION を使っている事例があった。どうもよくわからんが、おそらくは、
 (PF_OPTION, "file_type"  ,("File type: "), 0 ,[".jpg", ".png", ".tif", ".pcx", ".xcf", ("all registered formats")]),
↓
 (PF_OPTION, 変数名文字列, 項目名, 0, ["hoge", "fuga", "piyo"]),
じゃないかしら。変数に入ってくる値は、0,1,2, 等なのだと思う。たぶん。自信無いけど。

以上、1 日分です。

過去ログ表示

Prev - 2012/08 - Next
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project