我有很多层,边界不规则,有背景。我想"融入"通过在边界上逐渐应用某种过滤器将图像渲染到背景中。有没有办法自动执行此操作?
我尝试的是:
这种方法有点奏效,但我的问题是我有重叠的层。这意味着上面的方法将层的边界淡化为背景,而不是彼此。
我从未尝试过在GIMP中编写脚本,但如果有人有一个可行的解决方案,我非常愿意尝试它。
答案 0 :(得分:0)
是的 - 这可以编写脚本。
基本上,GIMP中的脚本可以通过UI执行通常可能执行的任何操作,有些则不是。
因此,一旦确定了每个所需图层需要执行的步骤 -
喜欢,按颜色选择最大阈值并取消透明度 - (应该可以选择图层的形状和可见内容)。
然后,缩小,反转和羽化选择
并使用" TRASPARENT_FILL"来应用" gimp edit cut",或编程" gimp-edit-fill"。
对于其中每个操作,您都可以查看help->procedure_browser
下的可用来电。
现在,要创建GIMP Python脚本,您需要做的是:
创建一个Python 2程序,它将导入" gimpfu"模块;将其作为GIMP s plug-in folder (check the folders at
编辑 - >偏好设置 - >文件夹中的exectuable
在脚本中,您编写主函数和其他任何函数 - 主函数可以将任何GIMP对象作为输入参数,如Image,Drawable,color,palette,r简单字符串和整数 -
之后,您可以对注册gimpfu.register
函数进行适当的调用 - 这将使您的脚本成为一个插件,在GIMP中有自己的菜单选项。通过调用gimpfu.main()来完成脚本。
此外,没有"准备好"一种方法可以选择插件中的一组图层,而不是只将当前活动的图层作为输入。作为这些案例的非常方便的解决方法,我滥用了"链接"图层标记(单击图层对话框,到可见性图标的中间右侧将显示一个"链"图标,表示图层已链接)
总而言之,插件的模板只是:
#! /usr/bin/env python
# coding: utf-8
import gimp
from gimpfu import *
def recurse_blend(img, root, amount):
if hasattr(root, "layers"):
# is image or layer group
for layer in root.layers:
recurse_blend(img, layer, amount)
return
layer = root
if not layer.linked:
return # Ignore layers not marked as "linked" in the UI.
# Perform the actual actions:
pdb.gimp_image_select_color(img, CHANNEL_OP_REPLACE, layer, (0,0,0))
pdb.gimp_selection_shrink(img, amount)
pdb.gimp_selection_invert(img)
pdb.gimp_selection_feather(img, amount * 2)
pdb.gimp_edit_clear(layer)
def blend_layers(img, drawable, amount):
# Ignore drawable (active layer or channel on GIMP)
# and loop recursively through all layers
pdb.gimp_image_undo_group_start(img)
pdb.gimp_context_push()
try:
# Change the selection-by-color options
pdb.gimp_context_set_sample_threshold(1)
pdb.gimp_context_set_sample_transparent(False)
pdb.gimp_context_set_sample_criterion(SELECT_CRITERION_COMPOSITE)
recurse_blend(img, img, amount)
finally:
# Try to restore image's undo state, even in the case
# of a failure in the Python statements.
pdb.gimp_context_pop() # restores context
pdb.gimp_selection_none(img)
pdb.gimp_image_undo_group_end(img)
register(
"image_blend_linked_layers_edges", # internal procedure name
"Blends selected layers edges", # Name being displayed on the UI
"Blend the edges of each layer to the background",
"João S. O. Bueno", # author
"João S. O. Bueno", # copyright holder
"2018", # copyright year(s)
"Belnd layers edges", # Text for menu options
"*", # available for all types of images
[
(PF_IMAGE, "image", "Input image", None), # Takes active image as input
(PF_DRAWABLE, "drawable", "Input drawable", None), # takes active layer as input
(PF_INT, "Amount", "amount to smooth at layers edges", 5), # prompts user for integer value (default 5)
],
[], # no output values
blend_layers, # main function, that works as entry points
menu="<Image>/Filters/Layers", # Plug-in domain (<Image>) followed by Menu position.
)
main()