但是在一个矩形中,它会在外面少一些,里面多一些,还是相反?并且在一条线上会向上、向下、向左还是向右?
这条线在路径的两侧将具有相同的宽度。如果这与像素网格不对齐,则会得到一些抗锯齿结果。
我知道在奇数线宽中,“围绕路径”意味着中心有 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