一、layer.compositingFilter
使用CALayer
自带的过滤器添加灰阶滤镜,可以直接在VC上加,也可以加到window
,实现全站灰阶(适合整个页面或局部灰阶。该方案只支持iOS13及以上)
func grayLayer() {
let childView = UIView(frame: CGRect(x: 100, y: 200, width: 200, height: 200))
childView.backgroundColor = .lightGray
childView.isUserInteractionEnabled = false
childView.layer.compositingFilter = "saturationBlendMode"
self.view.addSubview(childView)
}
二、CGColorSpaceCreateDeviceGray
使用CoreGraphics
修改图片色彩空间
extension UIImage {
var greyScaled:UIImage? {
let width = self.size.width
let height = self.size.height
let rect = CGRectMake(0, 0, width, height)
let colorSpace = CGColorSpaceCreateDeviceGray()
let bitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.none.rawValue)
let context = CGContext(data: nil,
width: Int(width),
height: Int(height),
bitsPerComponent: 8,
bytesPerRow: 0,
space: colorSpace,
bitmapInfo: bitmapInfo.rawValue)
if let selfCGImage = self.cgImage {
context?.draw(selfCGImage, in: rect)
guard let greyImage = context?.makeImage() else {
return self
}
let alphaInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.alphaOnly.rawValue)
let maskContext = CGContext(data: nil,width: Int(width),
height: Int(height),
bitsPerComponent: 8,
bytesPerRow: 0,
space: colorSpace,
bitmapInfo: alphaInfo.rawValue)
maskContext?.draw(selfCGImage, in: rect)
guard let maskImage = maskContext?.makeImage() else {
return self
}
guard let masked = greyImage.masking(maskImage) else {
return self
}
return UIImage(cgImage: masked, scale: self.scale, orientation: self.imageOrientation)
}
return self
}
}
三、CIFilter
CoreImage
的CIPhotoEffectMono
滤镜
extension UIImage {
func Mono() -> UIImage {
let context = CIContext(options: nil)
if let currentFilter = CIFilter(name: "CIPhotoEffectMono"){
currentFilter.setValue(CIImage(image: self), forKey: kCIInputImageKey)
let output = currentFilter.outputImage
let cgimg = context.createCGImage(output!,from: output!.extent)
let processedImage = UIImage(cgImage: cgimg!)
return processedImage
}
return self
}
}
参考链接
stackoverflow.com/questions/6…