CGImage Masking在iOS 12上停止工作

问题描述 投票:3回答:1

我有一种通过剪切(即使透明)任何高于或低于某一亮度的像素来掩盖B&W图像的方法。结果将是相同的黑白图像,但是所有高于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 noob。任何人都可以帮我弄清楚在iOS 12中这种方法可能会破坏什么,以及我可以做些什么来解决它?

objective-c core-graphics mask ios12 cgimage
1个回答
4
投票

基于this answer到一个相关的问题,显然我需要在尝试掩码之前将其转换为未压缩的JPG,以删除任何alpha通道。

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

因此iOS 12之前的透明度工作正常,但iOS 12停止工作。以上链接的答案很有用。

© www.soinside.com 2019 - 2024. All rights reserved.