По сути, пользовательский алгоритм будет, согласно этой теме :
Возьмите окрестность 3x3 вокруг пикселя, пороговое значение альфа-канала и посмотрите, не имеет ли какой-либо из 8 пикселей вокруг пикселя значение альфа-канала, отличное от него. Если это так, нарисуйте
круг заданного радиуса с центром в пикселе. Чтобы сделать внутри / снаружи, модулируйте пороговым альфа-каналом (не используйте другую сторону). Вам придется портировать большую окрестность, если радиус круга больше пикселя (что, вероятно, и есть).
Это реализовано с использованием морфологических операций в оттенках серого. Это также тот же метод, который используется для расширения / сокращения выбора. По сути, для перемещения по центру выделения (или альфа-каналу) сначала нужно сделать две отдельные копии выделения. Первый выбор будет расширен на радиус штриха, а второй будет сокращен. Затем непрозрачность обводки будет получена путем вычитания второго выделения из первого.
Для выполнения внутренних и внешних обводок вы должны сжиматься / расширяться вдвое по радиусу и вычитать части, которые пересекаются с исходным выделением.
Следует отметить, что наиболее общий морфологический алгоритм требует O (m * n) операций, где m - количество пикселей изображения, а n - количество элементов в «структурирующем элементе». Однако для определенных особых случаев это можно оптимизировать для операций O (m) (например, если структурирующий элемент представляет собой прямоугольник или ромб).