ios - UIImage 屏蔽问题 iOS 7

标签 ios uiimage mask

我大量借用(标准)代码将灰度 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 - UIImage 屏蔽问题 iOS 7,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18939417/

相关文章:

iphone - 自定义 UIButton

ios - 如何在 SwiftUI 上使用 CAEmitterLayer 制作动画?

iOS卷起动画去掉uiimageview

ios - 使用自动布局的 UIImage 旁边的 UILabel

ios - 从 SQL 数据库保存和加载图像

c++ - 使用二进制掩码获取感兴趣区域 C++ itk

python - Numpy:创建一个掩码数组来选择矩形

css - mask /剪裁 div

iOS Swift 3 存在 MFMailComposeViewController 导致崩溃

ios - UIImage(contentsOfFile) 的内存问题