ios - CGImageCreateWithMask() 不返回蒙版图像

标签 ios uiimage core-graphics mask

我正在尝试用另一个 UIImage 掩盖一个 UIImage。要 mask 的图像是根据颜色渐变生成的, mask 是[UIImage systemImageNamed:]。问题是 mask 后生成的 UIImage 看起来像没有应用 mask 的渐变。我提供了创建渐变以及用其他图像掩盖渐变的方法。任何人都可以确定这里出了什么问题吗?预先感谢您!

// Creating the image

UIImage *mask = [UIImage systemImageNamed:@"person.crop.circle.fill.badge.plus"];
UIImage *gradient = [UIImage imageWithGradientColours:@[[UIColor redColor], [UIColor greenColor]] size:mask.size];
UIImage *masked = [gradient imageByApplyingMaskImage:mask];
UIImageView *imageView = [[UIImageView alloc] initWithImage:masked];
[self.view addSubview:imageView];

// UIImage+Gradient
// Generates a UIImage of the specified size with a gradient in the specified colours

+ (UIImage*)imageWithGradientColours:(NSArray*)colours size:(CGSize)size {
    CAGradientLayer *gradientLayer = [CAGradientLayer layer];
    gradientLayer.frame = CGRectMake(0, 0, size.width, size.height);
    NSMutableArray *cgColours = [NSMutableArray array];
    for (UIColor *colour in colours) {
        [cgColours addObject:(id)colour.CGColor];
    }
    gradientLayer.colors = cgColours;

    UIGraphicsBeginImageContext(size);
    [gradientLayer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *gradientImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return [gradientImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
}

// UIImage+MaskWithImage
// Returns a UIImage with a mask applied using the provided mask image
- (UIImage *)imageByApplyingMaskImage:(UIImage *)maskImage {
    CGImageRef maskRef = maskImage.CGImage;

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

    CGImageRef maskedImageRef = CGImageCreateWithMask(self.CGImage, mask);
    UIImage *maskedImage = [UIImage imageWithCGImage:maskedImageRef scale:[[UIScreen mainScreen] scale] orientation:UIImageOrientationUp];

    CGImageRelease(mask);
    CGImageRelease(maskedImageRef);

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

最佳答案

啊,我找到答案了。我必须对蒙版图像进行一些处理,然后它才能作为蒙版正常工作:

- (UIImage *)imageAsMask {
    //Ensure the image isn't rendered as template
    //Tint the image with [UIColor blackColor]
    UIImage *mask = [[self imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] imageWithTintColor:[UIColor blackColor]];

    //Context for redrawing the mask
    UIGraphicsBeginImageContextWithOptions(mask.size, YES, 1.0);
    //Fill the mask with white background
    [[UIColor whiteColor] setFill];
    CGContextFillRect(UIGraphicsGetCurrentContext(), CGRectMake(0, 0, mask.size.width, mask.size.height));

    //Draw the black mask on top of the white background
    [mask drawAtPoint:CGPointZero];

    //Get the image from the context and return
    mask = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return mask;
}

然后生成一个蒙版图像,我只需这样做:

UIImage *mask = [[UIImage systemImageNamed:@"person.crop.circle.fill.badge.plus"] imageAsMask];
UIImage *gradient = [UIImage imageWithGradientColours:@[[UIColor redColor], [UIColor greenColor]] size:mask.size];
UIImage *masked = [gradient imageByApplyingMaskImage:mask];

关于ios - CGImageCreateWithMask() 不返回蒙版图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58680513/

相关文章:

ios - UDID 和 UUID 的区别

ios - CollectionView 内的按钮不可点击

ios - 如何以编程方式使用 UIGraphicsImageRenderer 拍摄高质量的屏幕截图?

ios - 使用 Core Graphics 绘制元素或提供图像?

swift - OSX/swift : Call function when screen becomes available

android - Colorfy 应用程序开发人员如何在包含许多图像的情况下保持应用程序的小尺寸?

ios - 如何在后台线程 iOS 中运行一个进程

uiimage - 如何将 UIImage 居中到 UIButton?

ios - UIImage 是否支持 HEIC/HEIF

objective-c - 如何找到给定线的起点和终点的箭头尖端点