Gimpfu脚本:为什么图层的ID被破坏了?

时间:2016-01-14 00:50:37

标签: python ubuntu gimp gimpfu

我一直在试验GIMP(v2.8.10)图层的操作,以编程方式使用自定义gimpfu插件。我成功地完成了选择,旋转,缩放和翻译现有图层的一部分:

插件中的一些代码:

简化相关性。所有这些说明都有效。

# 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
  • 崩溃
  

使用“layer”arg的错误ID调用了gimp-layer-translate过程。可能是尝试使用未发生的层进行操作。

我不知道为什么会这样失败。 如果他们单独工作,为什么不一起工作?我想知道。

参考

我使用gimpbook.com中的template.py作为构建插件的起点,因为它似乎有一个可靠的结构将代码封装到“撤消块”中。我在Google上找到的pdb的主要信息来源是this website。另外,我在this question找到了我需要的一些程序。

此外,我的previous questions之一可能会帮助您了解如何开始为gimp制作自定义插件。

是什么阻碍了我

我不确定原因是否是一个gimp的错误,或者我的代码是否被错误地实现了。由于在linked question的答案上发布了一些代码,我想知道我是否过度使用可用内存(毕竟,我不知道我必须使用特定的过程调用来销毁对象,直到我找到了答案)。 如果我不删除它会怎么样?我想知道。 在关闭GIMP之前,它们是否会持久存储在RAM中,还是会产生泛滥GIMP系统的持久文件?老实说,我不知道忽略这个问题的后果。

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

我通过在执行这两个函数之前将floating_layer切换到新的Layer实例来修复它。

fixed_layer = gimp.Layer(img, 'float_layer', int(gh), int(gw),
                                           RGBA_IMAGE, 100, 1)

所以我做了以下组合:

# Transform floating selection step by step
float_layer = pdb.gimp_item_transform_rotate_simple(float_layer, 
                                             ROTATE_90, 1, 0, 0)
fixed_layer = gimp.Layer(img, 'float_layer', new_width, new_height,
                                           RGBA_IMAGE, 100, 1)
fixed_layer = pdb.gimp_layer_scale(float_layer, new_width,new_height, 1)
fixed_layer = pdb.gimp_layer_translate(float_layer, h_offset, 0)

问题似乎是,在对图层执行某些程序后,它变为None(如果它自动从内存中删除了......)。这个解决方案允许我执行2或3个以上的操作......这不是一个完整的解决方案。我会一直在研究