首页 > 解决方案 > CGImage Masking 在 iOS 12 上停止工作

问题描述

我有一种方法可以通过剪切(即透明)任何高于或低于某个亮度的像素来屏蔽黑白图像。结果将是相同的黑白图像,但亮度高于 70% 或低于 25% 的所有内容(或您选择的任何内容)都变为透明。

期望的结果

它在 iOS 11 上运行良好,但在 iOS 12 上崩溃了。它现在每次都返回原始的、纯色的图像,没有任何修改。

-(UIImage*)imageWithLumaMaskFromDark:(CGFloat)lumaFloor toLight:(CGFloat)lumaCeil {
    // inputs range from 0 - 255
    CGImageRef rawImageRef = self.CGImage;

    const CGFloat colorMasking[6] = {lumaFloor, lumaCeil, lumaFloor, lumaCeil, lumaFloor, lumaCeil};

    UIGraphicsBeginImageContext(self.size);
    CGImageRef maskedImageRef = CGImageCreateWithMaskingColors(rawImageRef, colorMasking);
    {
        //if in iphone
        CGContextTranslateCTM(UIGraphicsGetCurrentContext(), 0.0, self.size.height);
        CGContextScaleCTM(UIGraphicsGetCurrentContext(), 1.0, -1.0);
    }

    CGContextDrawImage(UIGraphicsGetCurrentContext(), CGRectMake(0, 0, self.size.width, self.size.height), maskedImageRef);
    UIImage *result = UIGraphicsGetImageFromCurrentImageContext();
    CGImageRelease(maskedImageRef);
    UIGraphicsEndImageContext();
    return result;
}

我是一位经验丰富的 iOS 开发人员,但也是一个完整的 CGImage/CGContext 菜鸟。谁能帮我弄清楚在 iOS 12 中这种方法可能会破坏什么,以及我能做些什么来修复它?

标签: objective-ccore-graphicsmaskios12cgimage

解决方案


基于对相关问题的回答,显然我需要在尝试使用蒙版之前将其转换为未压缩的 JPG,以删除任何 alpha 通道。

在 iOS 12 中发生的变化是,根据他们的发行说明,“各种核心图形调用已得到强化,无法继续使用无效参数。在 iOS 12 中,这些调用现在可能返回 nil 或提前返回。”

因此,在 iOS 12 之前包含的透明度工作正常,但在 iOS 12 中停止工作。上面的链接答案效果很好。


推荐阅读