如何正确构建简单的重复形状模式以用作开罗的填充?

时间:2018-05-04 22:43:24

标签: cairo pycairo

我对开罗很新,并且正在摆弄一个生成小型SVG图像的程序。我想用重复的图案填充其中一些图像的区域,这些图案也是在开罗构建的 - 换句话说,我一直试图在内存中绘制开罗表面,然后将其用作填充路径的源图案在另一个表面上。从API来看,这看起来应该是相对简单的,但我似乎缺少了一些东西,因为尝试像具有背景颜色的表面的图案一样简单而简单的形状只填充表面的背景颜色。 / p>

下面是一个相对最小化的示例(一直使用路径而不是rect,因为我的预期用法涉及任意形状):

import cairo

def drawPattern(ctx):
    ctx.move_to(0.0, 0.0)
    ctx.line_to(0.0, 1.0)
    ctx.line_to(1.0, 1.0)
    ctx.line_to(1.0, 0.0)
    ctx.line_to(0.0, 0.0)
    ctx.set_source_rgb(0.8, 1.0, 0)
    ctx.fill()
    ctx.move_to(0.5, 0.8)
    ctx.line_to(0.8, 0.5)
    ctx.line_to(0.5, 0.2)
    ctx.line_to(0.2, 0.5)
    ctx.line_to(0.5, 0.8)
    ctx.set_source_rgb(0, 0, 0)
    ctx.fill()

surf = cairo.SVGSurface("test.svg", 256, 256)
context = cairo.Context(surf)
context.scale(256, 256)

patternSurf = cairo.SVGSurface(None, 32, 32)
patternCtx = cairo.Context(patternSurf)
patternCtx.scale(32, 32)
drawPattern(patternCtx)
patternSurf.flush()

context.move_to(0.0, 0.0)
context.line_to(0.0, 1.0)
context.line_to(1.0, 1.0)
context.line_to(1.0, 0.0)
context.line_to(0.0, 0.0)
context.set_source_rgb(0.0, 1.0, 0.0)
context.fill()

context.move_to(0.5, 0.0)
context.line_to(0.5, 1.0)
context.line_to(1.0, 1.0)
context.line_to(1.0, 0.0)
context.line_to(0.5, 0.0)
context.set_source_surface(patternSurf)
context.get_source().set_extend(cairo.Extend.REPEAT)
context.fill()

surf.finish()

我的这个例子的目的是它会产生一个简单的方形图像,左半部分为绿色,右半部分为黄绿色和重复的黑色钻石。然而,虽然黄绿色背景颜色确实存在,但钻石并没有出现(这代表了我一直以来的更广泛的问题)。如何纠正这一问题,以便将黑色钻石表面正确地用作另一个表面的重复图案填充?

我正在使用Pycairo,安装了Cairo版本1.14.12,但我想这个问题可能是开罗使用的一般问题,而不是特定于Python绑定。

1 个答案:

答案 0 :(得分:2)

将图像绘制到surf时,您正在缩放图像。由于初始context.scale(256, 256)patternSurf的表面内容在绘制之前以256倍缩放。当我在调用contxt.scale(1.0/256.0, 1.0/256.0)之前添加set_source_surface时,我会得到我猜您期望的结果。

相关问题