iOS一键置灰

488 阅读1分钟

一、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

CoreImageCIPhotoEffectMono滤镜


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…

stackoverflow.com/questions/4…

github.com/onevcat/Kin…