ios - CGImageCreateWithMask() 不返回蒙版图像
问题描述
我正在尝试UIImage
用另一个来掩盖 a UIImage
。要遮罩的图像是由颜色渐变生成的,遮罩是[UIImage systemImageNamed:]
. 问题是UIImage
遮罩后的结果看起来像没有应用遮罩的渐变。我已经提供了创建渐变和用其他图像掩盖它的方法。任何人都可以确定这里出了什么问题吗?先感谢您!
// 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];
推荐阅读
- paypal - 设置交易与设置授权
- office-ui-fabric - 将 FluentUI Stack 组件制成的拆分窗格中的宽度固定为 50/50
- wordpress - 显示特定类别标签中的帖子数量
- django - Django RSS 提要:有什么方法可以缓存 M2M 关系以显示在 item_title 中?
- ios - ViewModel 获取新数据时视图未更新
- android - 使用类 App.getContext().getString 的 JUnit 测试中的 Java.lang.NullPointerException
- python - 用字母而不是数字枚举
- aframe - Aframe 字体字体大小和字体类型
- javascript - 来自 .mp4 或 .webm 的网络摄像头录制文件无法在 MacOS Safari 浏览器和 iOS 设备上播放
- javascript - 遍历对象数组并堆叠 Chart JS Bar?