我正在尝试编写一个脚本,将一个层分成小小的和平。它运行正常但没有任何东西粘贴到新图层中。
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。 我该如何解决? 有更好的方法吗?
答案 0 :(得分:1)
我现在正在看你的剧本 - 这是一个很好的方法 - 我发现了什么是错的: 当您调用gimp_edit_paste时,您创建的选择(使用gimp_rect_select)仍处于活动状态,并且浮动图层的内容将被剪切。 (实际上我认为它们只是在“selection_anchor”调用时才是clipepd,但这是无关紧要的。)
因此,在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>)
。