iOS10 beta3 上的图像遮罩失败
Image masking fails on iOS10 beta3
一段时间以来,我们使用以下代码将不透明的灰度图像屏蔽为彩色图像。
在 Apple 发布 iOS 10 beta 3 之前,这一直工作正常。突然不再应用遮罩,导致返回的只是一个带有给定颜色的方框。
在 header 使用图像遮罩遮蔽图像
这段代码的逻辑:
* 拍摄一张没有alpha的灰度图
* 用给定的颜色创建一个纯色图像
* 根据给定的图像创建一个蒙版
* 用创建的蒙版蒙住实体图像
* 输出是一个蒙版图像,也考虑了两者之间的颜色(灰色可能是浅红色)。
有人知道如何修复此功能吗?
如果你有 XCode 8 beta 3,你可以 运行 这段代码,在低于 iOS 10 的模拟器上,这将正常工作,在 iOS 10 上,它只会创建一个正方形盒子
示例图片:
public static func image(maskedWith color: UIColor, imageNamed imageName: String) -> UIImage? {
guard let image = UIImage(named: imageName)?.withRenderingMode(.alwaysOriginal) else {
return nil
}
guard image.size != CGSize.zero else {
return nil
}
guard
let maskRef = image.cgImage,
let colorImage = self.image(with: color, size: image.size),
let cgColorImage = colorImage.cgImage,
let dataProvider = maskRef.dataProvider
else {
return nil
}
guard
let mask = CGImage(maskWidth: maskRef.width, height: maskRef.height, bitsPerComponent: maskRef.bitsPerComponent, bitsPerPixel: maskRef.bitsPerPixel, bytesPerRow: maskRef.bytesPerRow, provider: dataProvider, decode: nil, shouldInterpolate: true),
let masked = cgColorImage.masking(mask)
else {
return nil
}
let result = UIImage(cgImage: masked, scale: UIScreen.main().scale, orientation: image.imageOrientation)
return result
}
public static func image(with color: UIColor, size: CGSize) -> UIImage? {
guard size != CGSize.zero else {
return nil
}
let rect = CGRect(origin: CGPoint.zero, size: size)
UIGraphicsBeginImageContextWithOptions(size, false, UIScreen.main().scale)
defer {
UIGraphicsEndImageContext()
}
guard let context = UIGraphicsGetCurrentContext() else {
return nil
}
context.setFillColor(color.cgColor)
context.fill(rect)
let image = UIGraphicsGetImageFromCurrentImageContext()
return image;
}
此问题已在 iOS10 beta 4 中解决。
一段时间以来,我们使用以下代码将不透明的灰度图像屏蔽为彩色图像。
在 Apple 发布 iOS 10 beta 3 之前,这一直工作正常。突然不再应用遮罩,导致返回的只是一个带有给定颜色的方框。
在 header 使用图像遮罩遮蔽图像
这段代码的逻辑: * 拍摄一张没有alpha的灰度图 * 用给定的颜色创建一个纯色图像 * 根据给定的图像创建一个蒙版 * 用创建的蒙版蒙住实体图像 * 输出是一个蒙版图像,也考虑了两者之间的颜色(灰色可能是浅红色)。
有人知道如何修复此功能吗? 如果你有 XCode 8 beta 3,你可以 运行 这段代码,在低于 iOS 10 的模拟器上,这将正常工作,在 iOS 10 上,它只会创建一个正方形盒子
示例图片:
public static func image(maskedWith color: UIColor, imageNamed imageName: String) -> UIImage? {
guard let image = UIImage(named: imageName)?.withRenderingMode(.alwaysOriginal) else {
return nil
}
guard image.size != CGSize.zero else {
return nil
}
guard
let maskRef = image.cgImage,
let colorImage = self.image(with: color, size: image.size),
let cgColorImage = colorImage.cgImage,
let dataProvider = maskRef.dataProvider
else {
return nil
}
guard
let mask = CGImage(maskWidth: maskRef.width, height: maskRef.height, bitsPerComponent: maskRef.bitsPerComponent, bitsPerPixel: maskRef.bitsPerPixel, bytesPerRow: maskRef.bytesPerRow, provider: dataProvider, decode: nil, shouldInterpolate: true),
let masked = cgColorImage.masking(mask)
else {
return nil
}
let result = UIImage(cgImage: masked, scale: UIScreen.main().scale, orientation: image.imageOrientation)
return result
}
public static func image(with color: UIColor, size: CGSize) -> UIImage? {
guard size != CGSize.zero else {
return nil
}
let rect = CGRect(origin: CGPoint.zero, size: size)
UIGraphicsBeginImageContextWithOptions(size, false, UIScreen.main().scale)
defer {
UIGraphicsEndImageContext()
}
guard let context = UIGraphicsGetCurrentContext() else {
return nil
}
context.setFillColor(color.cgColor)
context.fill(rect)
let image = UIGraphicsGetImageFromCurrentImageContext()
return image;
}
此问题已在 iOS10 beta 4 中解决。