Ios 在不使用图像遮罩的情况下剪切图像?

Ios 在不使用图像遮罩的情况下剪切图像?,ios,objective-c,calayer,mask,Ios,Objective C,Calayer,Mask,我正在尝试在我的iPhone应用程序中添加一项功能,允许用户录制屏幕。为此,我使用了一个名为的开源类,它通过renderInContext:方法编译了一系列主视图的屏幕截图。但是,此方法忽略了蒙面CALayers,这是我的应用程序的关键 编辑: 我需要一种方法来记录屏幕,以便包括遮罩。尽管这个问题特别提出了一种创建图像蒙版错觉的方法,但为了成功录制屏幕,我愿意进行任何其他修改 应用程序说明 在该应用程序中,我拍摄了一张照片,并通过设置下颚区域位置的动画来创建移动嘴巴的效果,如下所示 目前,我

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

编辑: 我需要一种方法来记录屏幕,以便包括遮罩。尽管这个问题特别提出了一种创建图像蒙版错觉的方法,但为了成功录制屏幕,我愿意进行任何其他修改

应用程序说明

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

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

然后使用路径动画设置下巴层的动画

如前所述,
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];

我建议您单独绘制每个部分(不需要遮罩)、没有下巴的脸和下巴,这两个部分周围都有alpha像素,然后只需绘制下巴并在路径上移动


如果这对您没有帮助,请告诉我,如果您只是需要它来捕获屏幕,那么使用诸如


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

为什么不将下巴的加厚层画成一个单独的CGImage,并用它制作一个新的UIImage?
然后,您可以将此CGImage添加到单独的UIImageView,例如,您可以使用PangestureRecognitor在其中移动?

您是否尝试过查看

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


我最初有一个“没有下巴的脸”层和一个“下巴”层,但我遇到了一些问题,所以我决定用我现在的方式来做。我对图像绘制有点缺乏经验。你能更详细地解释一下用alpha像素画图是什么意思吗?你可以使用paint函数在一个对象上画你想要的任何东西,比如说你使用的是jpanel,你在它上面画你的图像,你必须考虑alpha像素,因为它们在这个过程中可能会丢失,因为它们没有rgb值。您必须使用argb绘制它们(很抱歉,我现在不在家,无法参考我的旧项目文件),我希望此链接可以帮助您使用alpha贴图绘制图像:我注意到此链接是针对java的。我在和objective coh一起工作,我想你在用java,我想我喝醉了或者什么的。我会为您检查一下,但同样的概念也应该适用。这是由用户记录屏幕,而不是我。我可以从普通的calayer制作图像,但在有遮罩的情况下则不行,因为这种方法涉及到
renderInContext
方法。有没有一种不同的方法来绘制用于遮罩的图层?你不能在不使用CALayers的情况下在CGContext中遮罩吗?就像下面的回答一样:我可以得到一个裁剪过的图像,但是我认为我忽略了坐标系的变化,因为裁剪过的路径是垂直翻转的,并且在屏幕的另一侧。我在上面添加了我的代码,这些东西中的图像方向是b***;)尝试使用以下答案中的代码:
 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];
//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);