剪切当前上下文,使其被路径掩盖

时间:2013-12-07 22:05:36

标签: ios objective-c core-graphics quartz-graphics

给定一个绘制到上下文然后转换为CGImageRef的路径,我将如何剪切上下文(其中提供了一个提供的前景图像),以便所述上下文被CGImage屏蔽(之前是一条路径)?

如果不完全清楚,下面的问题代码应该更好地说明我的观点。请注意,所有这些都是在UIView的drawRect:方法中调用的,而scaledImageRectangle(UIImage * image,CGRect rect)函数只返回一个矩形。

    // Close the path
    CGContextClosePath(context);
    CGContextDrawPath(context, kCGPathFillStroke);

    // Mask the image
    CGImageRef mask = CGBitmapContextCreateImage(context);
    [foregroundImage drawInRect:scaledImageRectangle(foregroundImage, rect)];
    CGContextClipToMask(context, scaledImageRectangle(foregroundImage, rect), mask);

    // Finally draw the masked image
    UIImage *maskedImage = [UIImage imageWithCGImage:CGBitmapContextCreateImage(context)];
    [maskedImage drawInRect:scaledImageRectangle(foregroundImage, rect)];

例如,这是一个黑色笔划代表路径的图像 Before mask

这是掩盖时图像的样子 After mask

1 个答案:

答案 0 :(得分:4)

我可能倾向于在触摸进入时构建路径(我使用UIBezierPath),然后您的自定义视图可以使用该路径来剪切图像,以及用于抚摸剪切的路径图像:

- (void)drawRect:(CGRect)rect
{
    CGContextRef context = UIGraphicsGetCurrentContext();

    CGContextSaveGState(context);

    if (self.isClipped) {
        CGContextAddPath(context, [self.path CGPath]);
        CGContextClip(context);
    }

    [self.image drawInRect:self.bounds];

    CGContextRestoreGState(context);

    [[UIColor blackColor] setStroke];
    self.path.lineWidth = 4.0;
    [self.path stroke];
}

unclipped clipped

如果你想在触摸时绘制路径,我个人会通过单独的CAShapeLayer渲染它(以避免不必要的重绘图像)。