CGImage Masking 在 iOS 12 上停止工作
CGImage Masking stopped working on iOS 12
我有一种方法可以通过剪切(即透明化)任何高于或低于特定亮度的像素来屏蔽黑白图像。结果将是相同的黑白图像,但亮度高于 70% 或低于 25%(或您选择的任何值)的所有内容都变为透明。
它在 iOS 11 上运行完美,但在 iOS 12 上坏了。它现在 returns 每次都没有修改的原始实心图像。
-(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 中的这种方法可能有什么问题,我可以做些什么来修复它?
基于 this answer 一个相关问题,显然我需要在尝试蒙版之前将其转换为未压缩的 JPG,以删除任何 alpha 通道。
在 iOS 12 中发生的变化是,根据他们的 Release Notes,"Various Core Graphics calls have been hardened against continuing with invalid parameters. In iOS 12, these calls may now return nil or return early."
因此 iOS 12 之前包含的透明度工作正常,但 iOS 12 停止工作。上面的链接答案效果很好。
我有一种方法可以通过剪切(即透明化)任何高于或低于特定亮度的像素来屏蔽黑白图像。结果将是相同的黑白图像,但亮度高于 70% 或低于 25%(或您选择的任何值)的所有内容都变为透明。
它在 iOS 11 上运行完美,但在 iOS 12 上坏了。它现在 returns 每次都没有修改的原始实心图像。
-(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 中的这种方法可能有什么问题,我可以做些什么来修复它?
基于 this answer 一个相关问题,显然我需要在尝试蒙版之前将其转换为未压缩的 JPG,以删除任何 alpha 通道。
在 iOS 12 中发生的变化是,根据他们的 Release Notes,"Various Core Graphics calls have been hardened against continuing with invalid parameters. In iOS 12, these calls may now return nil or return early."
因此 iOS 12 之前包含的透明度工作正常,但 iOS 12 停止工作。上面的链接答案效果很好。