关于ios:在保留alpha通道的同时将图像转换为黑白图像

 2020-11-26 

Convert image to black and white while preserving alpha channel

我想将已经具有Alpha通道(RGBA)的png图像转换为黑白图像。

我使用以下类别进行操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
func convertToGrayScale() -> UIImage {
    let imageRect:CGRect = CGRectMake(0, 0, self.size.width, self.size.height)
    let colorSpace = CGColorSpaceCreateDeviceGray()
    let width = self.size.width
    let height = self.size.height

    let bitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.None.rawValue)
    let context = CGBitmapContextCreate(nil, Int(width), Int(height), 8, 0, colorSpace, bitmapInfo.rawValue)

    CGContextDrawImage(context, imageRect, self.CGImage)
    let imageRef = CGBitmapContextCreateImage(context)
    let newImage = UIImage(CGImage: imageRef!)

    return newImage
}

但是,当我将CGImageAlphaInfo更改为None以外的任何内容时,我的imageRef返回nil,从而使应用程序崩溃。

有没有办法,或者我正在尝试一些不可能的事情?


修正了使用CoreImage滤镜作为Yi.Zhang建议:)

1
2
3
4
5
6
7
func convertToGrayScale() -> UIImage {
    let filter: CIFilter = CIFilter(name:"CIPhotoEffectMono")!
    filter.setDefaults()
    filter.setValue(CoreImage.CIImage(image: self)!, forKey: kCIInputImageKey)

    return UIImage(CGImage: CIContext(options:nil).createCGImage(filter.outputImage!, fromRect: filter.outputImage!.extent))
}

(迅速2.0)