UIImage用手势掩盖

时间:2014-06-30 09:18:49

标签: ios objective-c uiimage core-image

我试图在iOS中实现 selective color 功能。我个人认为首先使用手指手势绘制形状并将其转换为蒙版,但同时它应该是实时的,它应该在我将手指移动到灰度图像时起作用。任何人都可以指引我改正道路。

示例应用:https://itunes.apple.com/us/app/color-splash/id304871603?mt=8

感谢。

1 个答案:

答案 0 :(得分:0)

您可以将两个UIImageViews放在彼此之上,背景中的颜色版本和前景中的黑白版本。

然后,您可以使用touchesBegantouchesMoved等事件来跟踪用户输入。在移动的触摸中,你可以“擦除”用户像这样移动手指的路径(self.foregroundDrawView是黑色和白色UIImageView):

    UIGraphicsBeginImageContext(self.foregroundDrawView.frame.size);
    [self.foregroundDrawView.image drawInRect:CGRectMake(0, 0, self.foregroundDrawView.frame.size.width, self.foregroundDrawView.frame.size.height)];

    CGContextRef context = UIGraphicsGetCurrentContext();

    CGContextSetBlendMode(context, kCGBlendModeClear);
    CGContextSetAllowsAntialiasing(context, TRUE);
    CGContextSetLineWidth(context, 85);
    CGContextSetLineCap(context, kCGLineCapRound);
    CGContextSetRGBStrokeColor(context, 1, 0, 0, 1.0);
    // Soft edge ... 5.0 works ok, but we try some more
    CGContextSetShadowWithColor(context, CGSizeMake(0.0, 0.0), 13.0, [UIColor redColor].CGColor);

    CGContextBeginPath(context);
    CGContextMoveToPoint(context, touchLocation.x, touchLocation.y);
    CGContextAddLineToPoint(context, currentLocation.x, currentLocation.y);

    CGContextStrokePath(UIGraphicsGetCurrentContext());

    self.foregroundDrawView.image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

重要的部分是CGContextSetBlendMode(context, kCGBlendModeClear);。这将从图像中删除跟踪部分,然后将图像设置为前景图像视图的图像。

用户完成后,您应该可以将两张图像合并,或使用黑白图像作为遮罩。