图像合成

7 投票
1 回答
2843 浏览
提问于 2025-04-16 15:04

我有一个音乐乐队的专辑标题。我想用一个遮罩来绘制它,这个遮罩会让图片的角变圆。

所以,我在gimp里准备了这样的遮罩:

在这里输入图片描述

我使用的是白色的遮罩,但在白色背景下它是看不见的。

这是我用来渲染的代码:

# Draw album image
img = cairo.ImageSurface.create_from_png('images/album.png')
ctx.set_source_surface(img, posX, posY)
ctx.paint()

# Draw mask
ctx.set_operator(cairo.OPERATOR_DEST_IN)
img = cairo.ImageSurface.create_from_png('images/mask.png')
ctx.set_source_surface(img, posX, posY)
ctx.paint()

如你所见,我使用了 OPERATOR_DEST_IN。我在这个页面上找到了快速示例。

但是,当我在cairo中设置合成操作符时,我的程序里的所有东西都消失了 :(. 当我把那行代码注释掉时,一切都正常,但遮罩覆盖在我的图片上。那该怎么做才对呢?

附注:我使用的是python2和cairo库。


当我去掉合成操作符时,我看到的效果是(别忘了,真实的遮罩是白色的,而这个专辑图片是黑色的):

在这里输入图片描述

1 个回答

8

你需要分享一下你创建表面的代码,这里有一些我从你的例子扩展出来的代码:

import cairo

surface = cairo.ImageSurface (cairo.FORMAT_ARGB32, 128, 128)
ctx = cairo.Context (surface)

posX = posY = 0

img = cairo.ImageSurface.create_from_png('sample.png')  
ctx.set_source_surface(img, posX, posY)  
ctx.paint()

# Draw mask
ctx.set_operator(cairo.OPERATOR_DEST_IN)
img = cairo.ImageSurface.create_from_png('mask.png')
ctx.set_source_surface(img, posX, posY)
ctx.paint()

surface.write_to_png ("example.png") # Output to PNG

这段代码生成了下面这个漂亮的png图片(当时它是我桌面上唯一的图片;)在这里输入图片描述

撰写回答