1

レイヤーを小さなピースにスライスするスクリプトを作成しようとしています。正しく実行されますが、新しいレイヤーには何も貼り付けられません。

def explode_layer( i, l, dx, dy ):
    T=[]
    for ix,ox in enumerate(range(l.offsets[0], l.offsets[0]+l.width, dx )):
        for iy,oy in enumerate(range(l.offsets[1], l.offsets[1]+l.height, dy)):
            pdb.gimp_rect_select(i, ox, oy, dx, dy, 2, False, 0)
            if not pdb.gimp_edit_copy(l):
                continue
            layer = pdb.gimp_layer_new(i, dx, dy, 1, 
                                       l.name+" %d,%d"%(ix,iy), 100, 0)
            i.add_layer(layer)
            floating_sel = pdb.gimp_edit_paste(layer, True)
            pdb.gimp_layer_set_offsets(floating_sel, *layer.offsets)
            pdb.gimp_floating_sel_anchor(floating_sel)
            T.append(layer)
    return T

Ubuntu10.04でgimp2.6.8を使用しています。どうすれば修正できますか?より良いアプローチはありますか?

4

1 に答える 1

1

私は今あなたのスクリプトを見ています-それは良いアプローチです-そして私は何が悪いのかを見つけました:gimp_edit_pasteを呼び出すとき、あなたが(gimp_rect_selectで)作成した選択はまだアクティブであり、あなたのフロートレイヤーのコンテンツはクリップされますそれによります。(実際には、「selection_anchor」呼び出しでクリップされていると思いますが、それは関係ありません)。

したがって、pdb.gimp_selection_none(i)直前に行を追加するとfloating_sel = pdb.gimp_edit_paste(layer, True)、関数が修正されます。

def explode_layer( i, l, dx, dy ):
    T=[]
    for ix,ox in enumerate(range(l.offsets[0], l.offsets[0]+l.width, dx )):
        for iy,oy in enumerate(range(l.offsets[1], l.offsets[1]+l.height, dy)):
            pdb.gimp_rect_select(i, ox, oy, dx, dy, 2, False, 0)
            if not pdb.gimp_edit_copy(l):
                continue
            layer = pdb.gimp_layer_new(i, dx, dy, 1, 
                                       l.name+" %d,%d"%(ix,iy), 100, 0)
            i.add_layer(layer)
            pdb.gimp_selection_none(i)
            floating_sel = pdb.gimp_edit_paste(layer, True)
            pdb.gimp_layer_set_offsets(floating_sel, *layer.offsets)
            pdb.gimp_floating_sel_anchor(floating_sel)
            T.append(layer)
    return T

より簡単な方法は、新しいレイヤーを明示的に作成しないことです(ところで、新しいレイヤーを作成して追加する、ドキュメント化されていない「new_layer」メソッドが画像オブジェクトにあり、ほとんどのパラメーターに適切なデフォルトがあります-したがって、i.new_layer(<name>, <width>, <height>)十分です)-ただし、コピーして貼り付けるだけで、new_layer = pdb.gimp_floating_sel_to_layer(<floating_sel>)代わりに呼び出すことができます。

于 2012-05-24T02:46:57.473 に答える