CGImage的遮罩在iOS 12上停止工作

3

我有一种方法可以通过剪切(即使某些像素变成透明)任何亮度高于或低于特定亮度的黑白图像来进行屏蔽。结果将是相同的黑白图像,但是所有高于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个回答

4

根据这个答案,在尝试掩码之前,显然需要将其转换为未压缩的JPG格式,以去除任何Alpha通道。

iOS 12中发生的变化是,根据他们的发布说明,“各种核心图形调用已经针对无效参数进行了强化。在iOS 12中,这些调用现在可能会返回nil或提前返回。”

因此,在iOS 12之前包含的透明度可以正常工作,但在iOS 12之后停止工作。上面链接中的答案非常好用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接