【问题标题】:how to determine cairo drawing with line width even?如何确定线宽的开罗绘图?
【发布时间】:2019-10-19 17:03:17
【问题描述】:

我使用 cr(来自 Gtk 的小部件绘制事件)并且我想使用偶数像素(2、4、6 等)创建一个矩形(或一条线),而无需任何“上下文转换”。根据this,该行将是“路径”。并根据this圆形笔的直径”。

但是在一个矩形中,它会是更少的外部而更多的内部还是相反?并且在一条线上会是上、下、左还是右?

我知道,在奇数线宽中,“路径周围”表示 1 在中心,其余均在周围。 但是在偶数线宽中,如线宽为2时,路径内是1像素还是路径外?

是否有稳定的方法来确定受影响的像素还是随机的?

每次描边创建两次,首先是线宽 1,然后使用余数(奇数),这样会很痛苦而且很耗时。

【问题讨论】:

    标签: cairo pycairo pangocairo


    【解决方案1】:

    但是在一个矩形中,它是不是外面少而里面多,还是相反?并且在一条线上会是上、下、左还是右?

    这条线在路径的两侧将具有相同的宽度。如果这与像素网格不对齐,则会得到一些抗锯齿结果。

    我知道,在奇数线宽中,“路径周围”意味着 1 在中心,其余的都在周围。但是在偶数线宽中,如线宽为2时,路径内是1像素还是路径外?

    线宽为 3 时,将在路径的任一侧绘制 1.5 个像素。

    线宽为 4 时,在路径的任一侧绘制 2 个像素。

    也许下面的例子更清楚地说明了这一点。这是用 Lua 编写的,并使用 LGI 作为 Lua 的 cairo 绑定,但这直接映射到 C API:

    local cairo = require("lgi").cairo
    s = cairo.ImageSurface(cairo.Format.RGB24, 100, 30)
    cr = cairo.Context(s)
    
    cr:set_source_rgb(1, 1, 1)
    cr:paint()
    
    cr:set_source_rgb(0, 0, 0)
    
    cr:set_line_width(2)
    cr:rectangle(5, 10, 5, 5)
    cr:stroke()
    
    cr:set_line_width(6)
    cr:rectangle(15, 10, 14, 14)
    cr:stroke()
    
    cr:set_line_width(7)
    cr:rectangle(40.5, 10.5, 14, 14)
    cr:stroke()
    
    cr:set_line_width(7)
    cr:rectangle(70, 10, 14, 14)
    cr:stroke()
    
    s:write_to_png("out.png")
    

    生成的图像是:

    第一个矩形的线宽为 2。它是用整数坐标绘制的,因此有例如从 (5, 10) 到 (10, 10) 的一行(顶行)。一半的线宽画在线条的两侧,因此这条线对应于从 (4, 9) 到 (6, 11) 的“填充矩形”。

    最后一个矩形的线宽为 7,也是用整数坐标绘制的。它的顶线从 (70, 10) 到 (70, 24)。由于线宽的一半位于线的两侧,因此“填充矩形”从 (66.5, 6.5) 变为 (73.5, 27.5)。这些数字不是整数,您可以在结果中看到应用了一些抗锯齿功能。

    相比之下,倒数第二个矩形的位置偏移了 0.5。这会导致其“顶线”的“填充矩形”再次出现在像素网格上。

    另请参阅此常见问题解答条目:https://www.cairographics.org/FAQ/#sharp_lines

    【讨论】:

    • 感谢您的链接。它确实解决了我的问题,表明我必须将线端点调整 0.5
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-15
    • 2019-03-17
    • 1970-01-01
    • 2022-07-06
    • 2020-02-08
    相关资源
    最近更新 更多