2013-02-15 75 views
19

我有一个在前台和透明背景黄色花瓶的图像:认沽边框部分透明的图片被绘制在CGContext上

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)); 

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

enter image description here

这不是我所需要的。

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

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

+0

在调用CGContextDrawImage之前调用'CGContextSetShadowWithColor'吗? – Ariel 2013-02-20 01:22:03

+0

@elcanibal:是的。否则,不会有影子。我正在编辑原始问题以反映这一点。 – 2013-02-20 14:50:41

+0

请张贴透明背景的黄色花瓶的PNG。您的第一张(未修改过的)图像背景为灰色。 – 2013-02-20 20:49:53

回答

13

这样做的一种方法是使用mathematical morphology operator of dilation向外“生长”图像的alpha通道,然后使用生成的灰度图像作为蒙版来模拟笔画。通过填充扩大的面具,然后在主要的图像上绘制,你会得到中风的效果。我已经在Github上创建了一个展示这种效果的演示:https://github.com/warrenm/Morphology(所有源代码都是麻省理工学院许可的,如果它证明对您有用)。

这里是它在行动截图:

enter image description here

注意,这是惊人的慢(扩张需要一个内核在每一个像素的迭代),那么你应该选择一个笔划的宽度和预先计算提前为每个源图像屏蔽图像。

+1

我不知道将它移植到核心映像内核语言是否可行。这种实现可能比具有C标量操作的直接循环快得多。 – 2013-02-21 19:49:57

+0

对于一些有CI或甚至GLSL经验的人来说,这将是非常微不足道的。它只是一个邻域内的最小化算子。不过,我的理解是,Core Image在iOS上不可插入。另外,如果一个人聪明,可以利用内核的可分性或可分解性来做更少的工作。 – warrenm 2013-02-21 19:56:42

+0

当你说得对。我之前没有注意到:CIKernel在iOS中不存在(从iOS文档缺席)。 – 2013-02-21 19:58:39

0

我会尝试在调用CGContextDrawImage之前设置笔触颜色和线宽,或者调整阴影(不透明度,模糊等),使其看起来像图像周围的笔触。让我知道这个是否奏效!

+0

这是行不通的。两个原因:1.阴影不能准确模拟中风。 2。我需要把中风和阴影。所以我需要能够真正描绘图像。 – 2013-02-20 22:41:20

+0

您可以在调用'CGContextDrawImage'之前设置这两项,即事先调用'CGContextSetShadowWithColor','CGContextSetRGBStrokeColor'和'CGContextSetLineWidth'。 – Ariel 2013-02-20 22:51:16

+1

@elcanibal:但你是什么中风?你需要一条路径。 – 2013-02-21 01:09:09