在图像的特定部分填充颜色?

我想在图像的特定区域填充特定的颜色。

EX:

在这里输入图像说明

在上面的小丑图片中,如果接触小丑的头发,然后在头发上填充特定的颜色,或者触摸鼻子,然后在鼻子上填充特定的颜色等。我希望你能理解我想说的话。

使用谷歌search后,它可能是通过使用UIBezierPath或CGContext参考实现,但我很新,我试图阅读这个文档,但我不明白(花更多的时间)任何东西,我也有这个项目的时间限制。 所以我不能在这上面花更多的时间。

另外我发现我们可以使用Flood填充algorithm。 但我不知道如何使用我的情况。

注:我不想划分原始图像(如头发,鼻子,帽子等),因为如果我会这样做,将有这么多的图像捆绑,所以我需要处理正常和视网膜设备,所以这个选项对我没有帮助。

所以请给我你的宝贵意见,并告诉我哪个是最适合我的UIBezierPath或CGContext参考 ? 如何在图像的特定部分填充颜色? 和/或可以在区域的黑色边框下面填充颜色吗? 因为我是Quartz 2D Programming的新手。

使用下面的Github库。 该文章使用洪水填充algorithm: UIImageScanlineFloodfill

Objective C描述: ObjFloodFill

如果你想看看algorithm的详细解释: recursion解释与洪水填充algorithm(和僵尸和猫)

在其他语言的其他教程很less: 洛德的计算机graphics教程:洪水填充

而不是试图洪水填补基于栅格的图像的一个区域,更好的方法(和less得多的数据量)将创buildvector图像。 一旦你有一个vector图像,你可以描画轮廓绘制它无色,或者你可以填充轮廓绘制它的颜色。

我build议使用像CGContextStrokePath()CGContextFillPath()这样的CoreGraphics调用来完成绘图。 这可能看起来比使用洪水填充更好,因为你会得到很好的消除锯齿边缘。

苹果有一些很好的关于如何使用Quartz 2D进行绘制的文档 。 特别是关于path的部分对你正在尝试做的事很有用。

您可以基于图像Alpha透明度剪辑上下文

我用黑色和alpha创build了一个快速图像

在这里输入图像说明

然后使用下面的代码

 - (void)drawRect:(CGRect)rect { CGContextRef context = UIGraphicsGetCurrentContext(); // Get the context CGContextSetFillColorWithColor(context, [UIColor blueColor].CGColor); // Set the fill color to be blue // Flip the context so that the image is not flipped CGContextTranslateCTM(context, 0, rect.size.height); CGContextScaleCTM(context, 1.0, -1.0); // Clip the context by a mask created from the image UIImage *image = [UIImage imageNamed:@"image.png"]; CGImageRef cgImage = image.CGImage; CGContextClipToMask(context, rect, cgImage); // Finally fill the context with the color and mask you set earlier CGContextFillRect(context, rect); } 

结果

在这里输入图像说明

这是你可以做的一个简单的提示。 不过,您现在需要将图像转换为对需要移除的部分添加alpha透明

快速search后,我发现这些链接

如何将UIImage中的“白色”颜色更改为透明

如何使一个颜色在UIImage中透明

如果您将图像创build为SVGvector基础图像,则会非常轻(小于png,jpg),并且使用贝塞尔path可以非常容易地通过Quartz 2D进行pipe理。 贝塞尔path可以填充(白色在开始)。 UIBezierPath有一个方法(containsPoint :)来帮助定义你是否在内部点击。