在图像的特定部分填充颜色?
我想在图像的特定区域填充特定的颜色。
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 :)来帮助定义你是否在内部点击。