UIImage的遮罩能改变颜色吗?-iOS

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;

}

原始图片

输入图像描述

掩膜

输入图像描述

输出图片

输入图像描述

输入图像描述

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格式,类似于这样:

enter image description here


谢谢你的回答。我应该把那段代码放在哪里?顺便说一下,maskLayer的填充颜色已经是白色了。 - user1526474
我已经更新了我的回复。不幸的是,我现在没有Mac可以测试,但请告诉我进展如何。 - Bryan Chacosky
非常感谢。看起来现在它正在工作了。这次我有一个小问题。顶部和底部的部分没有正确地遮罩。请看最后一张图片。你知道为什么吗? - user1526474
你能附上你用作遮罩的图像吗?遮罩图像应该是灰度图像,其中白色代表将渗透的遮罩部分。 - Bryan Chacosky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接