2013-09-22 2 views
2

그레이 스케일 UIImage 마스크를 UIImage에 적용하는 코드를 많이 빌려 왔습니다 (표준). 그때 파일에 imageView.image을 저장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; 

}. 이 코드는 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

두 이미지 (마스크 할 이미지와 마스크 자체)에 알파 채널이 있는지 확인하십시오! 이로 인해 iOS7에서 저의 문제가 해결되었습니다.

그러면 iOS6에 사용한 이전 코드를 사용할 수 있습니다.