如何确定线宽均匀的开罗图形?

问题描述 投票:0回答:1

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

但是在一个矩形中,它的外面会更少,内部会更多还是相反?并在一行中是向上,向下,向左还是向右?

我知道在奇数行宽中,“ 在路径周围”是指中间的1,其余的都相等。但是,如果线宽为偶数,例如线宽为2,路径内部或外部将是1个像素吗?

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

遍历每次笔画两次,首先使用线宽1,然后使用其余的(奇数)数来消除痛苦和耗时。

cairo pycairo pangocairo
1个回答
0
投票

但是在一个矩形中,它的外面会更少,内部会更多还是相反?并在一行中是向上,向下,向左还是向右?

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

我知道,在奇数行宽中,“围绕路径”是指中间的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")

生成的图像是:Output of example program

第一个矩形的线宽为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

© www.soinside.com 2019 - 2024. All rights reserved.