Поместите границу вокруг частично прозрачного изображения, нарисованного на CGContext

У меня есть изображение с желтой вазой на переднем плане и прозрачным фоном:

введите описание изображения здесь

Я рисую его в CGContext:

CGContextDrawImage(context, CGRectMake(0, 0, 100, 100), myImage.CGImage); 

Я могу нарисовать тень вокруг него, используя следующую инструкцию перед CGContextDrawImage :

 CGContextSetShadowWithColor(context, CGSizeMake(0,0), 5, [UIColor blueColor].CGColor); 

введите описание изображения здесь

Но я хочу погладить изображение, чтобы оно выглядело следующим образом:

введите описание изображения здесь

Если бы я сделал это:

 CGContextSetRGBStrokeColor(shadowContext, 0.0f, 0.0f, 1.0f, 1.0f); CGContextSetLineWidth(shadowContext, 5); CGContextStrokeRect(shadowContext, CGRectMake(0, 0, 100, 100)); 

Он (очевидно) рисует прямоугольную рамку вокруг всего iamge следующим образом:

введите описание изображения здесь

Это не то, что мне нужно.

Но каков наилучший способ сделать границу, как в третьем изображении?

Обратите внимание, что в этом случае использовать UIImageView невозможно, поэтому использование свойств CALayer UIImageView неприменимо.

Один из способов сделать это – использовать оператор математической морфологии дилатации, чтобы «вырастить» альфа-канал изображения наружу, а затем использовать полученное изображение в оттенках серого как маску для имитации штриха. Заполняя расширенную маску, затем, рисуя основное изображение сверху, вы получаете эффект удара. Я создал демонстрацию, демонстрирующую этот эффект, доступный в Github здесь: https://github.com/warrenm/Morphology (все источники имеют лицензию MIT, если она окажется вам полезной).

И вот скриншот этого в действии:

введите описание изображения здесь

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

Я попытался бы установить цвет штриха и ширину линии перед вызовом CGContextDrawImage или CGContextDrawImage тень (непрозрачность, размытие и т. Д.), Чтобы он выглядел как обводка вокруг изображения. Дайте мне знать, если это сработает!

Interesting Posts
Давайте будем гением компьютера.