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

我在 Ubuntu 10.04 上使用 gimp 2.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 回答