3

我最近发现该renderinContext:方法忽略了任何图层蒙版。我正在尝试捕获我的应用程序屏幕的视频,其中我为蒙面 CALayer 的路径设置动画。

要录制屏幕,我正在使用ScreenCaptureView网上找到的课程。该视图每隔 x 秒对其子视图进行一次“截图”,并将它们编译成视频。

drawRect方法中,我调用

[[self.layer presentationLayer] renderInContext:context];

上网查了一下,找到了别人的解决办法;但是,它适用于图像蒙版。(我的面具是 CGPath)。

-(UIImage*) imageFromView:(UIView*)originalView
{
    //Creating a fakeView which is initialized as our original view.
    //Actually i render images on a fakeView and take screenshot of this fakeView.
    UIView *fakeView = [[UIView alloc] initWithFrame:originalView.frame];

   [fakeView.layer setMasksToBounds:originalView.layer.masksToBounds];

            //Getting subviews of originalView.
            for (UIView *view in originalView.subviews)
            {
                //Getting screenshot of layer of view.
                UIGraphicsBeginImageContext(view.bounds.size);
                [view.layer renderInContext:UIGraphicsGetCurrentContext()];
                UIImage *imageLayer = UIGraphicsGetImageFromCurrentImageContext();
                UIGraphicsEndImageContext();

                //If it is masked view, then get masked image.
                if (view.layer.mask)
                {
                    //getting screenshot of masked layer.
                    UIGraphicsBeginImageContext(view.bounds.size);
                    [view.layer.mask renderInContext:UIGraphicsGetCurrentContext()];

                    //PNG Representation is most important. otherwise this masked image will not work.
                    UIImage *maskedLayerImage=[UIImage imageWithData:UIImagePNGRepresentation(UIGraphicsGetImageFromCurrentImageContext())];
                    UIGraphicsEndImageContext();

                    //getting image by masking original image.
                    imageLayer = [self maskImage:imageLayer withMask:maskedLayerImage];
                }

                //If imageLayer is pointing to a valid object, then setting this image to UIImageView, our UIImageView frame having exactly as view.frame.
                if (imageLayer)
                {
                    UIImageView *imageView = [[UIImageView alloc] initWithFrame:view.frame];
                    [imageView setImage:imageLayer];
                    [fakeView addSubview:imageView];
                }
            }

            //At the end, taking screenshot of fakeView. This will get your Original Image.
            UIGraphicsBeginImageContext(fakeView.bounds.size);
            [fakeView.layer renderInContext:UIGraphicsGetCurrentContext()];
            UIImage *previewCapturedImage = UIGraphicsGetImageFromCurrentImageContext();
            UIGraphicsEndImageContext();
            return previewCapturedImage;
        }
}

//Method is used to get masked image.
- (UIImage*) maskImage:(UIImage *)image withMask:(UIImage *)maskImage
{
    CGImageRef maskRef = maskImage.CGImage; 
    CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef),
                                        CGImageGetHeight(maskRef),
                                        CGImageGetBitsPerComponent(maskRef),
                                        CGImageGetBitsPerPixel(maskRef),
                                        CGImageGetBytesPerRow(maskRef),
                                        CGImageGetDataProvider(maskRef), NULL, false);

    CGImageRef masked = CGImageCreateWithMask([image CGImage], mask);

    return [UIImage imageWithCGImage:masked];
}

我可以对来自 cgpaths 的掩码做类似的事情吗?

4

1 回答 1

0

您可以使用CGContextClip()inrenderInContext:剪辑到路径:

- (void)renderInContext:(CGContextRef)context {

    // Assign maskPath to whatever path you want to mask to (Here, it's assumed that your layer's mask is a CAShapeLayer)
    CGPathPathRef maskPath = [(CAShapeLayer *)self.mask path];
    CGContextAddPath(context, maskPath);
    CGContextClip(context);

    // Do drawing code here
}
于 2014-02-18T15:42:02.743 回答