Я пытаюсь замаскировать UIImage
с другим 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;
}