【问题标题】:Masking changes colors of UIImage- iOS遮罩改变 UIImage-iOS 的颜色
【发布时间】:2023-03-18 17:21:01
【问题描述】:

这是我正在做的动态屏蔽 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;

}

原图

面具

输出图像

【问题讨论】:

    标签: ios objective-c uiimage mask


    【解决方案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,如下所示:

    【讨论】:

    • 感谢您的回答.. 我应该把代码放在哪里?顺便说一下 maskLayer fillColor 已经是白色了..
    • 我已经更新了我的回复。不幸的是,我现在不在 Mac 上,所以无法测试,但请告诉我情况如何。
    • 非常感谢。似乎它现在正在工作..这次我有一个小问题。顶部和底部未正确遮盖。请看最后一张图片。你知道为什么吗?
    • 您能附上您用于遮罩的图片吗?蒙版图像应该是灰度图像,其中白色代表蒙版中会渗出的部分。
    猜你喜欢
    • 2014-12-07
    • 1970-01-01
    • 1970-01-01
    • 2012-12-10
    • 2020-04-27
    • 1970-01-01
    • 2018-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多