从一个表面画到另一个表面

3
import cairo
import math

w = 2000
h = 2000

surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, w, h)
ctx = cairo.Context(surface)
ctx.scale(w, h)

surface_path = cairo.ImageSurface(cairo.FORMAT_ARGB32, w, h)
ctx_path = cairo.Context(surface_path)
ctx_path.scale(w, h)

surface_circle = cairo.ImageSurface(cairo.FORMAT_ARGB32, w, h)
ctx_circle = cairo.Context(surface_circle)
ctx_circle.scale(w, h)

""" Lots of function calls that draw paths to surface_path and circles to surface_circle """

ctx.set_source_surface(surface_path, 0, 0)
ctx.paint()
ctx.set_source_surface(surface_circle, 0, 0)
ctx.paint()

surface_path.write_to_png("example.png")
surface_circle.write_to_png("example2.png")
surface.write_to_png("result.png")

Imgur中的图片链接

我正在尝试将两个表面(一个带有线条,一个带有圆形)编译到一个单独的表面上,然后将其保存到文件中。

尽管按照文档建议的方式进行操作,但最终图像仍为空白。我还尝试在surface_pathsurface_circle上调用flush(),但似乎没有任何作用。

我该如何将surface_circle(example2.png)中的图像信息叠加在surface_path(example.png)之上,然后将其输出到文件中?


我不是cairo的专家,但我认为你需要一个“掩码”。例如,你选择一个源并画一条线。沿着线的路径,源被复制到目标位置。如果你什么都不画,就不会传输任何东西。我建议你画一个大矩形,大小与图像相同。请参见http://cairographics.org/tutorial/#L1drawing。 - Cilyan
ctx.set_source_surface(surface_path, 0, 0) ctx.rectangle(0, 0, 1, 1) ctx.fill() ctx.set_source_surface(surface_circle, 0, 0) ctx.stroke() ctx.rectangle(0, 0, 1, 1) ctx.fill() ctx.stroke()我尝试了这段代码,但它似乎仍然无法正常工作。 - Sky
1个回答

3
尝试在最后几个paint()调用之前调用ctx.identity_matrix()。
当前情况下,由于您调用了ctx.scale(w, h),因此您只能获得其他表面的左上角像素,以填充整个目标表面。

好像已经起作用了。不过我还不太明白scale()和identity_matrix()的作用,你能简要解释一下或者给我一个相关资源链接吗? - Sky
1
当你使用scale(a, b)时,缩放将应用于所有后续操作。换句话说,它假装你正在绘制的表面只有大小为1/a、1/b。在你的代码中,它会缩放表面,使得所有坐标都在0到1之间,而不是在0到w或h之间。identity_matrix()所做的就是重置所有缩放、平移等,并返回到没有任何变换的状态。有关更多文档,请参见http://cairographics.org/manual/cairo-Transformations.html。 - Uli Schlachter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接