CGImage Masking在iOS 12上停止工作

时间:2019-02-23 19:32:34

标签: objective-c core-graphics mask ios12 cgimage

我有一种方法,可通过剪切(即使之透明)高于或低于特定亮度的任何像素来掩盖黑白图像。结果将是相同的黑白图像,但是所有高于70%或低于25%的亮度(或您选择的任何值)都变为透明。

Desired Result

它在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中使用此方法可能导致的问题以及如何解决该问题?

1 个答案:

答案 0 :(得分:4)

基于this answer的相关问题,显然我需要在尝试使用遮罩之前将其转换为未压缩的JPG,以删除所有Alpha通道。

iOS 12中发生的变化是,根据他们的Release Notes,“加强了对各种核心图形的调用,以防止继续使用无效的参数。在iOS 12中,这些调用现在可能返回nil或提前返回。”

因此,iOS 12之前包含的透明效果很好,但是iOS 12停止了工作。上面的链接的答案很好用。