【问题标题】:Cairo clip creates unwanted edgesCairo 剪辑创建不需要的边缘
【发布时间】:2014-07-08 13:57:16
【问题描述】:

我正在使用 pyCairo 在表面上绘制移动元素。 为了获得更好的性能,我尝试使用“剪辑”功能仅重绘更大图像的更改部分。不幸的是,它会在图像上创建不需要的边缘。可以看到剪辑的边缘。有没有可能避免这种行为?

import math
import cairo


def draw_stuff(ctx):
    """ clears background with solid black and then draws a circle"""
    ctx.set_source_rgb (0, 0, 0) # Solid color
    ctx.paint()

    ctx.arc (0.5, 0.5, 0.5, 0, 2*math.pi)
    ctx.set_source_rgb (0, 123, 0)
    ctx.fill()

WIDTH, HEIGHT = 256, 256

surface = cairo.ImageSurface (cairo.FORMAT_ARGB32, WIDTH, HEIGHT)
ctx = cairo.Context (surface)

ctx.scale (WIDTH, HEIGHT) # Normalizing the canvas

draw_stuff(ctx)

#Let's draw stuff again, this time only redrawing a small part of the image
ctx.save()
ctx.rectangle(0.2,0.2,0.2,0.2)
ctx.clip()
draw_stuff(ctx)
ctx.restore()

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

【问题讨论】:

  • 你能提供一张不需要的边缘的屏幕截图吗?
  • StackOverflow 要求我有 10 名声望才能发布图片。上面的代码在黑色背景上输出一个大绿色圆圈。还有一个不需要的矩形,在“剪辑”之后的绘图发生的地方有一个狭窄的黑色边缘。

标签: python cairo pycairo


【解决方案1】:

您应该将剪辑坐标四舍五入为整数(在设备空间中)。见http://cairographics.org/FAQ/#clipping_performance

我不知道 Python API,我只是猜测它在 C API 中的工作方式,但它是这样的:

def snap_to_pixels(ctx, x, y):
    x, y = ctx.user_to_device(x, y)
    # No idea how to round an integer in python,
    # this would be round() in C
    # (Oh and perhaps you don't want this rounding, but
    # instead want to round the top-left corner of your
    # rectangle towards negative infinity and the bottom-right
    # corner towards positive infinity. That way the rectangle
    # would never become smaller to the rounding. But hopefully
    # this example is enough to get the idea.
    x = int(x + 0.5)
    y = int(x + 0.5)
    return ctx.device_to_user(x, y)

# Calculate the top-left and bottom-right corners of our rectangle
x1, y1 = 0.2, 0.2
x2, y2 = x1 + 0.2, y1 + 0.2
x1, y1 = snap_to_pixels(ctx, x1, y1)
x2, y2 = snap_to_pixels(ctx, x2, y2)
# Clip for this rectangle
ctx.rectangle(x1, y1, x2 - x1, y2 - y1)
ctx.clip()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-04
    • 1970-01-01
    • 1970-01-01
    • 2018-05-13
    • 2018-03-07
    • 2012-07-14
    相关资源
    最近更新 更多