2013-09-22 64 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的舊代碼。