我一直在试验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系统的持久文件?老实说,我不知道忽略这个问题的后果。
答案 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个以上的操作......这不是一个完整的解决方案。我会一直在研究