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

时间:2013-02-15 20:00:52

标签: ios core-graphics cgcontext cgcontextdrawimage

我的图像前景是黄色花瓶,透明背景:

enter image description here

我在CGContext上绘制它:

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

我可以在CGContextDrawImage

之前使用以下语句在其周围画一个阴影
CGContextSetShadowWithColor(context, CGSizeMake(0,0), 5, [UIColor blueColor].CGColor);

enter image description here

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

enter image description here

如果我这样做了:

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

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

enter image description here

这不是我需要的。

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

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

2 个答案:

答案 0 :(得分:15)

执行此操作的一种方法是使用mathematical morphology operator of dilation向外“增长”图像的Alpha通道,然后使用生成的灰度图像作为模板来模拟笔划。通过填充扩张的面罩,然后将主图像绘制在顶部,您可以获得笔划的效果。我已经创建了一个演示此效果的演示,可以在Github上找到:https://github.com/warrenm/Morphology(所有来源都是MIT许可的,如果它对您有用)。

这是一个实际的截图:

enter image description here

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

答案 1 :(得分:0)

我会尝试在调用CGContextDrawImage之前设置笔触颜色和线宽,或调整阴影(不透明度,模糊等),使其看起来像图像周围的笔划。如果有效,请告诉我!