2013-06-13 28 views
3

我最近發現renderinContext:方法忽略了任何圖層蒙版。我正在嘗試捕捉我的應用屏幕的視頻,其中我製作了蒙版CALayer的路徑動畫。使用renderInContext:用於由cgpaths創建的蒙版

要記錄屏幕,我正在使用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製作蒙版嗎?

回答

0

您可以使用CGContextClip()renderInContext:夾到一個路徑:

- (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 
}