1

カスタム gimpfu プラグインを使用して、GIMP(v2.8.10) レイヤーの操作をプログラムで実験してきました。既存のレイヤーの一部を動的に選択、回転、スケーリング、および変換することに成功しました。

プラグイン内のコードの一部:

関連性のために簡略化されています。これらの指示はすべて機能します。

# I only use one layer in the probe image
layer = img.layers[0]

selection = pdb.gimp_rect_select(img, init_coords[0], init_coords[1],
                                            my_width,my_height,2,0,0)

# Copy and paste selection
pdb.gimp_edit_copy(layer)
float_layer = pdb.gimp_edit_paste(layer, 1)

# Transform floating selection step by step
float_layer = pdb.gimp_item_transform_rotate_simple(float_layer, 
                                             ROTATE_90, 1, 0, 0)
float_layer = pdb.gimp_layer_scale(float_layer, new_width,new_height, 1)
float_layer = pdb.gimp_layer_translate(float_layer, h_offset, 0)

問題

  • 最後の行 ( ) を削除すると、gimp_layer_translate他のすべてが機能します。
  • それ以外の場合は、代わりに含まれている行を削除すると、gimp_layer_scale他のすべてが機能します。
  • しかし、これらすべての機能を一緒に使用しようとすると、gimp_layer_translateクラッシュしますRuntimeError

プロシージャ gimp-layer-translate が呼び出され、«layer» 引数の ID が正しくありません。存在しないレイヤーを操作しようとしている可能性があります。

なぜこのように失敗するのかわかりません。彼らが個別に働くなら、なぜ一緒に働かないのですか?私は疑問に思う。

参考文献

コードを「元に戻すブロック」に囲むためのしっかりした構造を持っているように見えるため、プラグインを構築するための出発点として、私template.pygimpbook.comから始めます。私の主な情報源はpdb、Google で見つけたこのウェブサイトです。また、この質問で必要な手順をいくつか見つけました。

また、私の以前の質問の 1 つが、 gimp 用のカスタム プラグインの作成を開始する方法の参考になるかもしれません。

何が私を行き詰まらせているのか

原因が gimp のバグなのか、コードの実装が間違っているのかはわかりません。リンクされた質問への回答に投稿されたコードの一部が原因で、利用可能なメモリを使いすぎているかどうか疑問に思っています (結局のところ、特定のプロシージャ コールでオブジェクトを破棄しなければならないことがわかるまで知りませんでした)その答えで)。それらを削除しないとどうなりますか? 私は疑問に思う。それらは GIMP を閉じるまで RAM に残りますか、それとも GIMP システムをあふれさせる永続的なファイルを生成しますか? 正直なところ、この問題を無視した場合の結果についてはわかりません。

4

2 に答える 2

2

レイヤーを操作するときは、割り当てを削除してください。float_layer 変数を破棄する方法は次のとおりです。

# This creates a new layer that you assign to the float_layer
float_layer = pdb.gimp_item_transform_rotate_simple(float_layer, 
                                             ROTATE_90, 1, 0, 0)
# This does not return anything at all, it works with the layer in-place.
# But you overwrite the float_layer variable anyway, destroying it.
float_layer = pdb.gimp_layer_scale(float_layer, new_width,new_height, 1)
# This does not work because float_layer is no longer referencing the layer at all
float_layer = pdb.gimp_layer_translate(float_layer, h_offset, 0)

そのため、代わりに次のようにします。

float_layer = pdb.gimp_item_transform_rotate_simple(float_layer, 
                                             ROTATE_90, 1, 0, 0)
pdb.gimp_layer_scale(float_layer, new_width,new_height, 1)
pdb.gimp_layer_translate(float_layer, h_offset, 0)
于 2016-01-15T10:21:30.913 に答える