4

私は現在写真編集アプリを作っています。CIImageのPNG/JPEG表現は常にnilを返します

写真はユーザーによって選択された場合、それは自動的にこのコードを使用して、黒と白に変換されます。

func blackWhiteImage(image: UIImage) -> Data { 
    print("Starting black & white") 

    let orgImg = CIImage(image: image) 
    let bnwImg = orgImg?.applyingFilter("CIColorControls", withInputParameters: [kCIInputSaturationKey:0.0]) 

    let outputImage = UIImage(ciImage: bnwImg!) 

    print("Black & white complete") 

    return UIImagePNGRepresentation(outputImage)! 
} 

私はこのコードを持っています問題は、私はこのエラーを取得しておくことです。

fatal error: unexpectedly found nil while unwrapping an Optional value 

少し異なる設定で自分のコードを持っていましたが、それがUIImagePNG/JPEGRepresentation(xx)セクションに達するとまだ壊れています。

CIImageから画像ビュー/一般的なUIImageで使用するPNGまたはJPEGデータを取得する方法はありますか?

他の方法は、どのコードを使用すべきかについて十分詳細には説明されていません。

+0

A CIImageがある:あなたはまた、グレースケール画像を返すようにUIImageを拡張することができ

func blackWhiteImage(image: UIImage) -> Data? { guard let ciImage = CIImage(image: image)?.applyingFilter("CIColorControls", withInputParameters: [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 UIImagePNGRepresentation(redraw) } 

画像ではありません。画像を取得するにはレンダリングが必要です。 – matt

+0

http://stackoverflow.com/questions/40319229/uiimagepng-representation-from-avfoundation-returns-nilと他の多くの複製 – matt

答えて

3

ただ、新しいグラフィックスコンテキストを開始し、そこにグレースケール画像を描画:

extension UIImage { 
    var grayscale: UIImage? { 
     guard let ciImage = CIImage(image: self)?.applyingFilter("CIColorControls", withInputParameters: [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 = UIImagePNGRepresentation(grayscale) { 
    print(data.count) // 689035 
} 
関連する問題