3

UIImage を動的にマスクするために私が行っていることは次のとおりです。動作していますが、何らかの理由で出力画像の色が元のものと同じではありません。これは何が原因でしょうか?ありがとう..

- (void) setClippingPath:(UIBezierPath *)clippingPath : (UIImageView *)imgView {

    CAShapeLayer *maskLayer = [CAShapeLayer layer];
    maskLayer.frame = self.imgView.frame;
    maskLayer.path = [clippingPath CGPath];
    maskLayer.fillColor = [[UIColor whiteColor] CGColor];
    maskLayer.backgroundColor = [[UIColor clearColor] CGColor];

    self.imgView.image =  [self maskImage:self.imgView.image withClippingMask:[self imageFromLayer:maskLayer]];

}


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

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

    UIGraphicsEndImageContext();

    return outputImage;
}

-(UIImage*)maskImage:(UIImage *)image withClippingMask:(UIImage *)maskImage
{
    CGImageRef maskRef = image.CGImage;

    CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef),
                                        CGImageGetHeight(maskRef),
                                        CGImageGetBitsPerComponent(maskRef),
                                        CGImageGetBitsPerPixel(maskRef),
                                        CGImageGetBytesPerRow(maskRef),
                                        CGImageGetDataProvider(maskRef), NULL, false);

    CGImageRef maskedImageRef = CGImageCreateWithMask([maskImage CGImage], mask);
    UIImage *maskedImage = [UIImage imageWithCGImage:maskedImageRef];

    CGImageRelease(mask);
    CGImageRelease(maskedImageRef);

    // returns new image with mask applied
    return maskedImage;

}

元の画像

ここに画像の説明を入力

マスク

ここに画像の説明を入力

出力画像

ここに画像の説明を入力

ここに画像の説明を入力

4

1 に答える 1

1

CGImageMaskCreate のドキュメントには次のように記載されています。

ビットマップ イメージ マスクを使用してコンテキストに描画する場合、Quartz はマスクを使用して、現在の塗りつぶしカラーをイメージ四角形に適用する場所と方法を決定します。

したがって、黒を白に置き換えるだけの場合は、マスクを作成する前にコンテキスト カラーを設定できるはずです。

-(UIImage*)maskImage:(UIImage *)image withClippingMask:(UIImage *)maskImage
{
    CGImageRef maskRef = image.CGImage;

    CGContextSetFillColorWithColor( UIGraphicsGetCurrentContext( ), [ UIColor whiteColor ] );
    CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef),
                                        CGImageGetHeight(maskRef),
                                        CGImageGetBitsPerComponent(maskRef),
                                        CGImageGetBitsPerPixel(maskRef),
                                        CGImageGetBytesPerRow(maskRef),
                                        CGImageGetDataProvider(maskRef), NULL, false);

    CGImageRef maskedImageRef = CGImageCreateWithMask([maskImage CGImage], mask);
    UIImage *maskedImage = [UIImage imageWithCGImage:maskedImageRef];

    CGImageRelease(mask);
    CGImageRelease(maskedImageRef);

    // returns new image with mask applied
    return maskedImage;
}

次のような、より基本的なグレースケール JPG にマスクを更新することもできます。

ここに画像の説明を入力

于 2013-08-27T04:09:26.837 に答える