python中多边形绘制的亚像素精度?

时间:2018-05-14 03:00:17

标签: python 2d antialiasing

我有一些科学数据对于准确绘制非常重要。它是许多侧面共享多边形(来自voronoi分区的输出)的形式,它们是高密度的,并且通常小于画布上的单个像素。但是,我希望像素的值能够可靠地报告位于其中的多边形的积分亮度:例如,如果像素被亮度为1.0的多边形半覆盖而另一半被亮度为另一个多边形的多边形覆盖0.0,像素应该正好是0.5。

我在Python中这样做,所以理想情况下会有一些很好的库可用于高度精确的绘图。 Matplotlib有一个令人讨厌的错误,导致多边形被绘制得比它们的实际范围[0]略小,导致每个多边形边界周围的背景色线,即使多边形平铺平面而中间没有间隙。

[0] https://github.com/matplotlib/matplotlib/issues/2823

1 个答案:

答案 0 :(得分:1)

这可以通过优秀的Cairo库实现,该库专为高精度,高性能渲染而设计。只需使用pip install pycairo安装python binding

尝试以下简短示例。请注意子亚像素渲染如何导致蓝色和红色在某些像素位置混合成紫色。

import cairo

WIDTH, HEIGHT = 32, 32

surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, WIDTH, HEIGHT)
ctx = cairo.Context(surface)

# draw blue triangle
ctx.move_to(10, 10)
ctx.line_to(20.5, 10)
ctx.line_to(20.5, 20)
ctx.close_path()

ctx.set_source_rgb(0.5, 0.0, 0.0)
ctx.fill()

# draw blue triangle
ctx.move_to(10, 15)
ctx.line_to(20.5, 15)
ctx.line_to(20.5, 25)
ctx.close_path()

ctx.set_source_rgb(0.0, 0.0, 0.5)
ctx.fill()

surface.write_to_png("example.png")

enter image description here