2017-02-15 4 views
0

私は自分のコードでアンラップを減らそうとしていますが、必要でない場合はif letのチェックを書いたくないこともあります。UIImagePickerControllerのイメージにCGImage値がない可能性はありますか?

私は、ユーザが自分のカメラで写真を撮ったり、電話ライブラリから写真を撮ったり、切り抜いたり圧縮したりするコードの特定の部分で、たくさんの力を入れていることに気付きました。

  1. を私はimagePickerController(picker: didFinishPickingMediaWithInfo:)機能からアンラップ画像を強制:

    let pickedImage = info[UIImagePickerControllerOriginalImage] as! UIImage` 
    

    私はimagePicker.mediaTypes = [kUTTypeImage as String]を持っているので、私はこの1つについてかなり安心これは、すべての力を持つプロセスはアンラップです。

  2. 私はCGImageCreateWithImageInRectを使用して画像をトリミングし、その最初のパラメータはCGImageで、これを強制的にアンラップします。これは私の最大の前提であり、クラッシュしたことは一度もありませんが、安全ではないことはまだ分かっています。私が使用

    let cgImage = CGImageCreateWithImageInRect(pickedImage.CGImage!, cropRect) 
    let croppedImage = UIImage(CGImage: cgImage) 
    
  3. UIImageJPEGRepresentationNSDataを返しますが、画像が何CGImageRefを持っていない場合nilを返すかもしれません。以前の私の仮定に基づいて、私もアンラップを強制します。

    let jpegData = UIImageJPEGRepresentation(croppedImage, 0.85) 
    
  4. 私はjpegDatanilではないと仮定したので、私は再びアンラップ力によって結果画像を作成します。

    let resultImage = UIImage(data: jpegData)! 
    

TLDR:それはUIImagePickerControllerは何CGImageを持っていない画像を返すことは可能ですか?はいの場合は、ステップ1と2の間に小切手を追加して、CGImageの値があるかどうかを確認します。それでも安全に他の手順の展開を強制できますか?

+0

を取得していますか? – CodeChanger

+0

@CodeChanger上記のすべてのコードは動作しています(これまでのところ)。私は将来、潜在的な問題を避けるために修正しようとしています。つまり、はい、私はpickedImageにデータを取得しています。 – budidino

答えて

0

UIImage画像の =マネージャー

CIImage = "レシピ"、生でない画像が、 (プロパティ配列、色空間、URL(またはビデオからのピクセルバッファ)など)

CGI画像 =生のビットマップイメージ

はい、時にはUIImageがcgなしで表示されることがあります。しかし、代わりに 'レシピ' を検索し、自分でCGを作成してみてはどうですか? あなたは、コンテキストと「createCGImage」への呼び出しましょう:あなたは `pickedImage`オブジェクトにデータを

if let cg = pickedImage!.cgImage { 
    // you've got a CG :) 
} else { 
    // make CG yourself from CIImage 
    if let ci = pickedImage!.ciImage { 
     let context = CIContext() 
     guard let cgImage = context.createCGImage(ci, from: ci.extent) else { return } 
     let croppedImage = UIImage(cgImage: cgImage)  
    } 
} 
関連する問題