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