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

时间:2014-02-27 07:25:09

标签: ios iphone objective-c cocoa-touch uiimageview

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

EX:

enter image description here

在上面的 Joker 图片中,如果触摸小丑的头发然后在头发上填充特定的颜色或触摸鼻子然后在鼻子上填充特定的颜色...等我希望你能理解我在尝试什么说。

谷歌搜索之后可以通过使用UIBezierPathCGContext Reference来实现,但我是新手,我尝试阅读此文档,但我不明白 (带更多时间) 任何事情我也有这个项目的时间限制。所以我不能花更多的时间在上面。

此外,我发现我们可以使用Flood fill algorithm.但我不知道如何在我的情况下使用。

  

注意:我不想分割原始图像(例如头发,鼻子,帽子等等)因为如果我会这样做会有捆绑这么多的图像所以我需要为普通和视网膜设备处理它,所以这个选项对我没用。

所以请告诉我你最有价值的建议,并告诉我哪个最适合我UIBezierPathCGContext Reference如何在图像的特定部分填充颜色?和/或我们可以在区域的黑色边框下填充颜色吗?因为我是Quartz 2D Programming的新手。

4 个答案:

答案 0 :(得分:9)

使用下面的Github库。该帖子使用了填充算法:UIImageScanlineFloodfill

目标C描述:ObjFloodFill

如果您想查看算法的详细说明:Recursion Explained with the Flood Fill Algorithm (and Zombies and Cats)

其他语言的其他教程很少:Lode's Computer Graphics Tutorial : Flood Fill

答案 1 :(得分:3)

不是试图填充基于光栅的图像的区域,而是创建矢量图像的更好方法(以及更少量的数据)。获得矢量图像后,可以描绘轮廓以将其绘制为无色,或者可以填充轮廓以将其绘制为彩色。

我建议使用像CGContextStrokePath()CGContextFillPath()这样的CoreGraphics调用来进行绘图。这可能看起来比使用泛洪填充更好,因为你会得到很好的抗锯齿边缘。

Apple有一些关于如何使用Quartz 2D进行绘制的good documentation。特别是section on Paths对你要做的事情很有用。

答案 2 :(得分:2)

您可以根据图像Alpha透明度

剪辑上下文

我创建了一个黑色和alpha

的快速图像

enter image description here

然后使用以下代码

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

结果

enter image description here

这是您可以做的快速提示。但是,您现在需要转换图像以将alpha透明添加到需要删除的部分

快速搜索后,我找到了这些链接

How can I change the color 'white' from a UIImage to transparent

How to make one colour transparent in UIImage

答案 3 :(得分:2)

如果您将图像创建为SVG矢量基础图像,它将非常轻(小于png,jpg),并且使用贝塞尔路径通过Quartz 2D非常容易管理。 Bezier路径可以填充(开始时为白色)。 UIBezierPath有一个方法(containsPoint :),可帮助定义是否单击内部。