2

Masked CALayer からの UIImage が必要です。これは私が使用する機能です:

- (UIImage *)imageFromLayer:(CALayer *)layer
{
    UIGraphicsBeginImageContext([layer frame].size);

    [layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *outputImage = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    return outputImage;
}

問題は、マスクが維持されていないことです。これは完成したコードです:

    CAShapeLayer * layerRight= [CAShapeLayer layer];
    layerRight.path = elasticoRight;
    im2.layer.mask = layerRight;

    CAShapeLayer * layerLeft= [CAShapeLayer layer];
    layerLeft.path = elasticoLeft;
    im3.layer.mask = layerLeft;

    [viewImage.layer addSublayer:im2.layer];
    [viewImage.layer addSublayer:im3.layer];


    UIImage *image_result = [self imageFromLayer:viewImage.layer];

viewImage を視覚化すると結果は正しくなりますが、レイヤーに関連する画像を取得しようとすると、マスクが失われます。

4

1 に答える 1

1

解決しました。今、私は画像マスクを取得し、CGContextClipToMask を使用しています。

CGRect rect = CGRectMake(0, 0, 1024, 768);

UIGraphicsBeginImageContextWithOptions(rect.size, YES, 0.0);

{
   [[UIColor blackColor] setFill];
   UIRectFill(rect);
   [[UIColor whiteColor] setFill];

   UIBezierPath *leftPath = [UIBezierPath bezierPath];

   // Set the starting point of the shape.
   CGPoint p1 = [(NSValue *)[leftPoints objectAtIndex:0] CGPointValue];
   [leftPath moveToPoint:CGPointMake(p1.x, p1.y)];

   for (uint i=1; i<leftPoints.count; i++)
   {
       CGPoint p = [(NSValue *)[leftPoints objectAtIndex:i] CGPointValue];
       [leftPath addLineToPoint:CGPointMake(p.x, p.y)];
   }
   [leftPath closePath];
   [leftPath fill];
}

UIImage *mask = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

UIGraphicsBeginImageContextWithOptions(rect.size, NO, 0.0);

{
   CGContextClipToMask(UIGraphicsGetCurrentContext(), rect, mask.CGImage);
   [im_senza drawAtPoint:CGPointZero];
}

UIImage *maskedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
于 2013-02-17T20:19:59.120 に答える