我有一种方法,可通过剪切(即使之透明)高于或低于特定亮度的任何像素来掩盖黑白图像。结果将是相同的黑白图像,但是所有高于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中使用此方法可能导致的问题以及如何解决该问题?
答案 0 :(得分:4)
基于this answer的相关问题,显然我需要在尝试使用遮罩之前将其转换为未压缩的JPG,以删除所有Alpha通道。
iOS 12中发生的变化是,根据他们的Release Notes,“加强了对各种核心图形的调用,以防止继续使用无效的参数。在iOS 12中,这些调用现在可能返回nil或提前返回。”
因此,iOS 12之前包含的透明效果很好,但是iOS 12停止了工作。上面的链接的答案很好用。