不使用图像蒙版裁剪图像?

时间:2013-06-14 01:49:20

标签: ios objective-c calayer mask

我正在尝试在我的iPhone应用中添加一项功能,允许用户录制屏幕。为此,我使用了一个名为ScreenCaptureView的开源类,它通过renderInContext:方法编译主视图的一系列屏幕截图。但是,此方法忽略了屏蔽CALayers,这是我的应用程序的关键。

修改 我需要一种方法来记录屏幕,以便包含掩码。虽然这个问题特别要求一种方法来创建一个图像蒙版的幻觉,但我可以做任何其他修改我可以成功录制屏幕。

APP说明

在应用程序中,我通过动画颌区域的位置来拍摄照片并创建移动嘴巴的效果,如下所示。

enter image description here enter image description here

目前,我将整个面部作为一个CALayer,将下巴区域作为单独的CALayer。为了制作下巴层,我使用CGPath从整个面部遮住下巴区域。 (此路径是不规则的形状,必须是动态的。)

enter image description here

- (CALayer *)getChinLayerFromPic:(UIImage *)pic frame:(CGRect)frame {


    CGMutablePathRef mPath = CGPathCreateMutable();
    CGPathMoveToPoint(mPath, NULL, p0.x, p0.y);
    CGPoint midpt = CGPointMake( (p2.x + p0.x)/2, (p2.y+ p0.y)/2);
    CGPoint c1 = CGPointMake(2*v1.x - midpt.x, 2*v1.y - midpt.y); //control points
    CGPoint c2 = CGPointMake(2*v2.x - midpt.x, 2*v2.y - midpt.y);

    CGPathAddQuadCurveToPoint(mPath, NULL, c1.x, c1.y, p2.x, p2.y);
    CGPathAddQuadCurveToPoint(mPath, NULL, c2.x, c2.y, p0.x, p0.y);

    CALayer *chin = [CALayer layer];
    CAShapeLayer *chinMask = [CAShapeLayer layer];
    chin.frame = frame;
    chin.contents = (id)[pic CGImageWithProperOrientation];
    chinMask.path = mPath;
    chin.mask = chinMask;
    CGPathRelease(mPath);
    return chin;

}

然后我用路径动画为下巴图层设置动画。

如前所述,renderInContext:方法忽略了蒙版,并返回整个脸部而不仅仅是下巴的图像。有什么方法可以创造出掩盖下巴的错觉吗?我想尽可能使用CALayers,因为它对动画来说最方便。但是,我对任何想法持开放态度,包括捕捉视频的其他方式。感谢。

修改 我将裁剪的下巴变成UIImage,然后将新图像设置为图层内容,而不是直接屏蔽图层。但是,裁剪区域与指定路径相反。

 CALayer *chin = [CALayer layer];
 chin.frame = frame;   
 CGImageRef imageRef = [pic CGImage];
 CGColorSpaceRef colorSpaceInfo = CGImageGetColorSpace(imageRef);
 int targetWidth = frame.size.width;
 int targetHeight = frame.size.height;
 CGBitmapInfo bitmapInfo = CGImageGetBitmapInfo(imageRef);

 CGContextRef bitmap = CGBitmapContextCreate(NULL, targetWidth, targetHeight, CGImageGetBitsPerComponent(imageRef), CGImageGetBytesPerRow(imageRef), colorSpaceInfo, bitmapInfo);
    CGContextAddPath(bitmap, mPath);
    CGContextClip(bitmap);
    CGContextDrawImage(bitmap, CGRectMake(0, 0, targetWidth, targetHeight), imageRef);
    CGImageRef ref = CGBitmapContextCreateImage(bitmap);
    UIImage *chinPic = [UIImage imageWithCGImage:ref];
    chin.contents = (id)[chinPic CGImageWithProperOrientation];

4 个答案:

答案 0 :(得分:0)

我建议你单独绘制每个部分(你不需要面具),没有下巴的脸,以及周围都有alpha像素的下巴,然后将下巴拉过来并在路径上移动它。

如果这对您没有帮助,请通知我,问候

答案 1 :(得分:0)

如果你只需要这个来捕获屏幕,那么使用诸如

之类的程序要容易得多

http://www.airsquirrels.com/reflector/

通过AirPlay将设备连接到计算机,然后在计算机上记录流。这个特别的程序内置了屏幕录制,非常方便。我认为有一个试用版可用于录制长达10分钟的录像。

答案 2 :(得分:0)

为什么不将下巴的CALayer绘制成单独的CGImage并用它创建一个新的UIImage? 然后你可以把这个CGImage添加到一个单独的UIImageView中,你可以用PanGestureRecognizer来移动它吗?

答案 3 :(得分:0)

您是否尝试过查看layer.renderInContext doesn't take layer.mask into account?

特别是(注意坐标翻转):

//Make the drawing right with coordinate switch
CGContextTranslateCTM(context, 0, cHeight);
CGContextScaleCTM(context, 1.0, -1.0);

CGContextClipToMask(context, CGRectMake(maskLayer.frame.origin.x * mod, maskLayer.frame.origin.y * modTwo, maskLayer.frame.size.width * mod,maskLayer.frame.size.height * modTwo), maskLayer.image.CGImage);

//Reverse the coordinate switch
CGAffineTransform ctm = CGContextGetCTM(context);
ctm = CGAffineTransformInvert(ctm);
CGContextConcatCTM(context, ctm);