PNG/JPEG representation from CIImage always returns nil

左心房为你撑大大i 提交于 2019-11-26 17:59:21

Just begin a new graphics context and draw your grayscale image there:

func blackWhiteImage(image: UIImage) -> Data? {
    guard let ciImage = CIImage(image: image)?.applyingFilter("CIColorControls", parameters: [kCIInputSaturationKey:0.0]) else { return nil }
    UIGraphicsBeginImageContextWithOptions(image.size, false, image.scale)
    defer { UIGraphicsEndImageContext() }
    UIImage(ciImage: ciImage).draw(in: CGRect(origin: .zero, size: image.size))
    guard let redraw = UIGraphicsGetImageFromCurrentImageContext() else { return nil }
    return redraw.pngData()  // Swift 4.2 Xcode 10 or later
    // return UIImagePNGRepresentation(redraw) Swift 4.1 - Xcode lower than 10
}

You can also extend UIImage to return a grayscale image :

extension UIImage {
    var grayscale: UIImage? {
        guard let ciImage = CIImage(image: self)?.applyingFilter("CIColorControls", parameters: [kCIInputSaturationKey: 0]) else { return nil }
        UIGraphicsBeginImageContextWithOptions(size, false, scale)
        defer { UIGraphicsEndImageContext() }
        UIImage(ciImage: ciImage).draw(in: CGRect(origin: .zero, size: size))
        return UIGraphicsGetImageFromCurrentImageContext()
    }
}

let profilePicture = UIImage(data: try! Data(contentsOf: URL(string:"http://i.stack.imgur.com/Xs4RX.jpg")!))!

if let grayscale = profilePicture.grayscale, let data = grayscale.pngData() {  // or Swift 4.1 or earlier -> let data = UIImagePNGRepresentation(grayscale)
    print(data.count)   //  689035
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!