将边框放在CGContext上绘制的部分透明图像周围

San*_*hry 21 core-graphics cgcontext ios cgcontextdrawimage

我有一个图像,前景中有一个黄色花瓶,透明背景:

在此输入图像描述

我在CGContext上绘制它:

CGContextDrawImage(context, CGRectMake(0, 0, 100, 100), myImage.CGImage);
Run Code Online (Sandbox Code Playgroud)

我可以使用以下语句在它周围画一个阴影CGContextDrawImage:

CGContextSetShadowWithColor(context, CGSizeMake(0,0), 5, [UIColor blueColor].CGColor);
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

但我想在图像周围放一个笔画,这样看起来就像是:

在此输入图像描述

如果我这样做:

CGContextSetRGBStrokeColor(shadowContext, 0.0f, 0.0f, 1.0f, 1.0f);
CGContextSetLineWidth(shadowContext, 5);
CGContextStrokeRect(shadowContext, CGRectMake(0, 0, 100, 100));
Run Code Online (Sandbox Code Playgroud)

它(显然)围绕整个iamge绘制一个矩形边框,如下所示:

在此输入图像描述

这不是我需要的.

但是在第三张图片中绘制边框的最佳方法是什么?

请注意,在这种情况下无法使用UIImageView,因此使用UIImageView的CALayer属性不适用.

war*_*enm 16

一种方法是使用扩张数学形态学算子向外"增长"图像的alpha通道,然后使用得到的灰度图像作为模板来模拟笔划.通过填充扩张的面罩,然后将主图像绘制在顶部,您将获得笔划的效果.我已经创建了一个显示这种效果的演示,可以在Github上找到:https://github.com/warrenm/Morphology(所有来源都是MIT许可的,如果它对你有用).

这是它的实际截图:

在此输入图像描述

请注意,这是非常缓慢的(扩张需要在每个像素上迭代内核),因此您应该选择笔划宽度并预先为每个源图像预先计算蒙版图像.