【问题标题】:UIImage masking problems iOS 7UIImage遮罩问题iOS 7
【发布时间】:2014-07-24 15:13:45
【问题描述】:

我大量借用(标准)代码,将灰度 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() 方法还是其他地方。

任何见解将不胜感激。非常感谢您。

【问题讨论】:

    标签: ios uiimage mask


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      上面的代码很好地说明了如何解决问题(绘制上下文),但对我不起作用。下面的代码适用于 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;
      }
      

      【讨论】:

      • 好吧,@dangel。这对我来说非常有效,开箱即用。
      • 完美运行,谢谢!
      【解决方案3】:

      确保两个图像(要遮罩的图像和遮罩本身)都具有 Alpha 通道!这解决了我在 iOS7 上的问题。

      那么你应该可以使用你在 iOS6 上使用过的旧代码了。

      【讨论】:

        猜你喜欢
        • 2014-12-07
        • 2012-12-10
        • 2023-03-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-23
        • 2014-08-20
        • 2017-01-17
        相关资源
        最近更新 更多