如何使用Python应用alpha掩码';s svgwrite模块?
我正在使用该模块以编程方式为项目创建一些图像。我需要使用alpha遮罩来创建渐变透明元素。我不清楚如何实际应用一个面具一旦被创建 在下面的示例中,我尝试使用圆形渐变在灰色正方形中创建渐变透明环。我可以创造广场;我可以分别创建圆形渐变def和一个填充它的圆形 把一个当作面具用在另一个身上我不明白如何使用Python应用alpha掩码';s svgwrite模块?,python,svg,Python,Svg,我正在使用该模块以编程方式为项目创建一些图像。我需要使用alpha遮罩来创建渐变透明元素。我不清楚如何实际应用一个面具一旦被创建 在下面的示例中,我尝试使用圆形渐变在灰色正方形中创建渐变透明环。我可以创造广场;我可以分别创建圆形渐变def和一个填充它的圆形 把一个当作面具用在另一个身上我不明白 def my_mask(): # define some params width = "500px" hei
def my_mask():
# define some params
width = "500px"
height = "500px"
radius = "50%"
black = "rgb(255, 255, 255)"
grey = "rgb(127,127,127)"
# create the drawing surface
canvas = svgwrite.Drawing('temp_mask.svg', (width, height))
# create defs, in this case, just a single gradient
rad_grad = canvas.radialGradient(("50%", "50%"), "50%", ("50%", "50%"), id="rad_grad")
rad_grad.add_stop_color("0%", black, 0)
rad_grad.add_stop_color("66.6%", black, 255)
rad_grad.add_stop_color("100%", black, 255)
# now to draw; first I create the rect object to be masked
base_rect = canvas.rect( (0, 0), (width, height), id="masked_rect").fill(grey)
canvas.add(base)
# and according to the docs, any SVG fragment can be an alpha mask, so I create this circle
mask_element = canvas.circle((radius, radius), radius, fill="url(#rad_grad)")
# but here's where I get confused; I don't get how this function actually makes use of one element to mask another
canvas.mask((0, 0), (width, height))
# No problem exporting to a file, though. :)
canvas.save()
以下是我想要的(红十字会刚刚加入以显示透明度);易于绘制草图
我怀疑这是一个不雅观的或至少是非常冗长的解决方案,但是,在又花了一个小时到处玩之后,我想出的一般解决方案是: 1) 在SVG defs中定义掩码 2) 将SVG对象添加到所述遮罩以创建alpha贴图 3) 可以预见,在遮罩对象的遮罩属性中引用遮罩: 注意:我的渐变中也有错误的值,因此它们永远不会生成我包含的图像;下面的代码也解决了这个问题
def my_mask():
# define some params
width = "500px"
height = "500px"
radius = "50%"
white = "rgb(255, 255, 255)"
black = "rgb(0, 0, 0)"
grey = "rgb(127,127,127)"
# create the drawing surface
canvas = svgwrite.Drawing('temp_mask.svg', (width, height))
# create defs, in this case, just a single gradient
rad_grad = canvas.radialGradient(("50%", "50%"), "50%", ("50%", "50%"), id="rad_grad")
rad_grad.add_stop_color("0%", black, 0)
rad_grad.add_stop_color("66.6%", white, 255)
rad_grad.add_stop_color("100%", white, 255)
canvas.defs.add(rad_grad)
# create the mask container as a def and include alpha-mapping objects
mask = canvas.mask((0, 0), (width, height), id="grad_mask")
mask.add(canvas.rect( (0, 0), (width, height) ).fill(white)
mask.add(canvas.circle((radius, radius), radius, fill="url(#rad_grad)")
canvas.defs.add(mask)
# now to draw; create the rect object and simply include the mask as an attribute
base_rect = canvas.rect( (0, 0), (width, height), mask="url(#grad_mask)".fill(grey)
canvas.add(base)
# Still no problem exporting to a file, though. ;)
canvas.save()
谢谢Jonline!ClipPath和Mask的svgwrite“示例”没有实际演示如何将其应用于图形。为了完整起见,我使用您的方法为ClipPath编写了一个真实的示例:
clip_path=dwg.defs.add(dwg.clipPath(id='my_clip_path1'))#命名剪辑路径
剪辑_path.add(dwg.circle((5*mm,5*mm,10*mm))35;将绘制此形状内的内容
testCircle=dwg.add(dwg.g(id='test',stroke='red',stroke_width=1,fill='black',fill_opacity=1,clip_path=“url(#my_clip_path1)”)
testCircle.add(dwg.circle((5*mm,10*mm,10*mm))