0

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

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

我知道在奇数线宽中,“围绕路径”表示中心为 1,其余部分均等。但是在均匀的线宽中,当线宽为 2 时,路径内部或外部会是 1 个像素吗?

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

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

4

1 回答 1

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

于 2019-10-23T15:51:52.390 回答