UIImage掩盖问题的iOS 7

我大量借用(标准)代码,将UIImage应用于灰度UIImage蒙版。

- (void) maskImage:(UIImage *)image withMask:(UIImage *)maskImage { CGImageRef imageRef = image.CGImage; // main UIImage CGImageRef maskRef = maskImage.CGImage; // grayscale UIImage mask CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef), CGImageGetHeight(maskRef), CGImageGetBitsPerComponent(maskRef), CGImageGetBitsPerPixel(maskRef), CGImageGetBytesPerRow(maskRef), CGImageGetDataProvider(maskRef), NULL, false); CGImageRef masked = CGImageCreateWithMask(imageRef, mask); maskedImage = [UIImage imageWithCGImage:masked]; CGImageRelease(mask); CGImageRelease(masked); imageView.image = maskedImage; 

}

然后我将imageView.image保存到一个文件。 这个代码在iOS 6和6.1中就像一个魅力一样。 保存的图像包含应用蒙版的主UIImage。 不过,我注意到这个代码在iOS 7(iPhone)中不能以相同的方式执行。 在iOS 7中,保存的图像只包含没有应用蒙版的主UIImage。 我不确定问题出在CGImageCreateWithMask()方法还是其他地方。

任何有识之士将不胜感激。 非常感谢你提前。

我也在我的应用程序中发现了这个问题,我通过下面的代码解决它。

 - (UIImage*)image:(UIImage*)image withMask:(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([handledImage CGImage], mask); CGImageRelease(mask); // Under iOS 7, UIImage with mask no longer applied mask when saving it. // We draw the image to context and obtain image from context to get the image applied mask CGContextRef context = CGBitmapContextCreate(nil, CGImageGetWidth(maskedImageRef), CGImageGetHeight(maskedImageRef), CGImageGetBitsPerComponent(maskedImageRef), CGImageGetBytesPerRow(maskedImageRef), CGImageGetColorSpace(maskedImageRef), CGImageGetBitmapInfo(maskedImageRef)); CGRect imageRect = CGRectMake(0, 0, CGImageGetWidth(maskedImageRef), CGImageGetHeight(maskedImageRef)); CGContextDrawImage(context, imageRect, maskedImageRef); CGImageRef imageRef = CGBitmapContextCreateImage(context); UIImage *maskedImage = [UIImage imageWithCGImage:imageRef]; CFRelease(imageRef); CGContextRelease(context); CGImageRelease(maskedImageRef); return maskedImage; } 

上面的代码提供了一个很好的想法,如何解决这个问题(绘制一个上下文),但没有为我工作。 下面的代码可以在IOS 7和以前的版本(IOS 6.x)上使用。

 +(UIImage*)maskImageExt:(UIImage *)image withMask:(UIImage *)maskImage { CGImageRef maskRef = maskImage.CGImage; CGImageRef imageRef = image.CGImage; CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef), CGImageGetHeight(maskRef), CGImageGetBitsPerComponent(maskRef), CGImageGetBitsPerPixel(maskRef), CGImageGetBytesPerRow(maskRef), CGImageGetDataProvider(maskRef), NULL, true); CGImageRef maskImageRef = CGImageCreateWithMask([image CGImage], mask); CGContextRef context = CGBitmapContextCreate(nil, CGImageGetWidth(imageRef), CGImageGetHeight(imageRef), CGImageGetBitsPerComponent(imageRef), CGImageGetBytesPerRow(imageRef), CGImageGetColorSpace(imageRef), CGImageGetBitmapInfo(imageRef)); CGRect imageRect = CGRectMake(0, 0, CGImageGetWidth(imageRef), CGImageGetHeight(imageRef)); CGContextDrawImage(context, imageRect, maskImageRef); CGImageRef maskedImageRef = CGBitmapContextCreateImage(context); UIImage *maskedImage = [UIImage imageWithCGImage:maskedImageRef]; CGImageRelease(mask); CGContextRelease(context); CGImageRelease(maskedImageRef); return maskedImage; } 

确保这两个图像(图像被掩盖和面具本身)有一个alpha通道! 这解决了我在iOS7上的问题。

那么你应该可以使用你用于iOS6的旧代码。