2013-09-22 61 views
2

我有大量借用(标准)代码,将UIImage应用于灰度UIImage掩码。UIImage掩盖问题iOS 7

- (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()方法还是其他地方。

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

回答

6

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

- (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; 
} 
6

上面的代码中给出了如何处理这个问题(图纸在上下文中),但对我没有工作是个好主意。下面的代码适用于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; 
} 
+1

对,@dangel。这对我来说非常合适,开箱即用。 – kubi

+0

完美工作,谢谢! –

0

确保两个图像(要蒙版的图像和蒙版本身)都有一个alpha通道!这解决了我在iOS7上的问题。

然后,您应该可以使用您用于iOS6的旧代码。