Алгоритм заливки, который учитывает альфу, не оставляя границ вокруг сглаженных линий? - PullRequest
2 голосов
/ 22 мая 2011

Я реализовал типичный алгоритм заливки, и он работает, как и ожидалось, когда используются сплошные цвета, когда я использую евклидово расстояние между компонентами ARGB для сравнения цветов.

Моя проблема в том, что если вы нарисуете что-то вроде красной линии с сглаживанием на прозрачном фоне, мой алгоритм заливки не будет заполнять большинство полупрозрачных пикселей, оставляя рамки вокруг объектов. В частности, для этого примера, центр линии имеет сплошной красный цвет (т. Е. (255, 255, 0, 0) в формате ARGB), а полосы линии также имеют сплошной красный цвет, но альфа этих пикселей варьируется до 1% альфа. (т.е. (1, 255, 0, 0)). Как правило, я хочу иметь возможность рисовать, скажем, контур сглаженного круга, заливать заливку в центре и не оставлять ее за пределами.

Какую функцию я использую для сравнения цветов и / или как адаптировать алгоритм заливки, чтобы такие полосы не оставались вокруг объектов?

Я пытался указать алгоритму всегда заполнять пиксель, если его альфа <90%, и иногда это выглядит нормально, но он слишком агрессивен при заполнении слабых линий. </p>

Редактировать: чтобы уточнить, как это выглядит, когда 0 - 5 представляет красные пиксели, альфа 0, 20, 40, 60, 80 и 100%, изображение сглаженной красной линии может выглядеть так:

0 0 0 0 0 0 0

0 0 0 3 0 0 0

0 0 3 5 3 0 0

0 0 3 5 3 0 0

0 0 3 5 3 0 0

0 0 0 3 0 0 0

0 0 0 0 0 0 0

Мой текущий алгоритм заливки заливки красным цветом в верхнем левом углу заменит все 0 на 5. Остальные 3 образуют уродливый ореол вокруг линии.

1 Ответ

0 голосов
/ 22 мая 2011

Ваша заливка должна заменить RGB части цветов, но оставить оригинальную альфа.Таким образом, вы получите новый цвет без изменения коэффициента смешивания.

(Если ваше растровое изображение использует предварительно умноженную альфа, вам следует масштабировать замену RGB на существующую альфа, но в ваших примерах вы неиспользуя предварительно умноженные альфы.)

...