将图像转换为灰度会弄乱 alpha

Converting image to grayscale messes up alpha

这是我用来将图像转换为灰度的代码。

func convertToGrayScale(image: UIImage) -> UIImage 
{
    let imageRect:CGRect = CGRectMake(0, 0, image.size.width, image.size.height)
    let colorSpace = CGColorSpaceCreateDeviceGray()
    let width = image.size.width
    let height = image.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, image.CGImage)
    let imageRef = CGBitmapContextCreateImage(context)
    let newImage = UIImage(CGImage: imageRef!)
    return newImage
}

这是结果:

我不想看到黑色背景。我该如何解决?

编辑:我试过用这段代码来做,它有效,但现在加载图像需要 3 秒。

func convertToGrayScale(image: UIImage) -> UIImage {

    let cgImage = image.CGImage!

    let beginImage = CIImage(CGImage: cgImage)
    let filter = CIFilter(name: "CIColorControls")!
    filter.setValue(beginImage, forKey: kCIInputImageKey)
    filter.setValue(0, forKey: kCIInputSaturationKey)
    return UIImage(CIImage: filter.outputImage!)
}

这个功能解决了我的问题。它不一定将图像变成灰度,但我能够将未知食谱设为黑色,半已知为深灰色,已知为彩色。

func createTintedImageFromImage(originalImage: UIImage, desiredColor: UIColor) -> UIImage {
    let imageSize: CGSize = originalImage.size
    let imageScale: CGFloat = originalImage.scale
    let contextBounds: CGRect = CGRectMake(0, 0, imageSize.width, imageSize.height)

    UIGraphicsBeginImageContextWithOptions(imageSize, false, imageScale)
    UIColor.blackColor().setFill()
    UIRectFill(contextBounds)
    originalImage.drawAtPoint(CGPointZero)
    let imageOverBlack: UIImage = UIGraphicsGetImageFromCurrentImageContext()
    desiredColor.setFill()
    UIRectFill(contextBounds)

    imageOverBlack.drawAtPoint(CGPointZero, blendMode: .Multiply, alpha: 1)
    originalImage.drawAtPoint(CGPointZero, blendMode: .DestinationIn, alpha: 1)

    let finalImage: UIImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    return finalImage
}