Точность субпикселя для рисования полигонов в python? - PullRequest
0 голосов
/ 14 мая 2018

У меня есть некоторые научные данные, которые очень важно правильно рисовать. Он имеет форму многоугольников с разделением сторон (вывод от разбиения вороной), которые очень плотные и часто меньше отдельного пикселя на холсте. Однако я хочу, чтобы значение пикселей достоверно отражало интегрированную яркость лежащих в них многоугольников: например, если пиксель наполовину покрыт многоугольником с яркостью 1,0, а другая половина - другим многоугольником с яркостью 0.0, пиксель должен быть точно 0.5.

Я делаю это на Python, поэтому в идеале должна быть хорошая библиотека для высокоточного рисования, которую я мог бы использовать. У Matplotlib есть неприятная ошибка, из-за которой многоугольники рисуются немного меньше, чем их фактические экстенты [0], что приводит к появлению фоновых линий вокруг границ каждого многоугольника, даже когда многоугольники располагаются на плоскости без промежутков между ними.

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

1 Ответ

0 голосов
/ 14 мая 2018

Это действительно возможно с превосходной библиотекой Cairo , специально созданной для высокоточного и высокопроизводительного рендеринга.Просто установите python-привязку с pip install pycairo.

Попробуйте следующий короткий пример.Обратите внимание, что при субпиксельном рендеринге синий и красный цвета в некоторых местах пикселей смешиваются с фиолетовым.

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

...