【Swift4】UIViewをUIImageに変換し、画像としてカメラロールに保存する方法

2020年8月29日

UIViewをUIImageに変換し、変換したUIImageをカメラロールに保存する方法です。
写真編集系のアプリや、フィルターカメラ系のアプリなどで使えたりします。

UIViewをUIImageに変換する方法

// UIViewからUIImageに変換する
func getImage(_ view : UIView) -> UIImage {
    
    // キャプチャする範囲を取得する
    let rect = view.bounds
    
    // ビットマップ画像のcontextを作成する
    UIGraphicsBeginImageContextWithOptions(rect.size, false, 0.0)
    let context : CGContext = UIGraphicsGetCurrentContext()!
    
    // view内の描画をcontextに複写する
    view.layer.render(in: context)
    
    // contextのビットマップをUIImageとして取得する
    let image : UIImage = UIGraphicsGetImageFromCurrentImageContext()!
    
    // contextを閉じる
    UIGraphicsEndImageContext()
    
    return image
}

コメントとして記述していますが、ビットマップコンテキストを作成し、UIImageにしたいUIViewに表示されている子要素となるUIViewやUIImageなどの全てをビットマップコンテキストに複写し、複写されたビットマップコンテキストをUIImageに変換するようにしています。

試してないですが、この方法で2つUIViewを1つのUIImageとして出力するといったことも可能だと思います。

UIImageをカメラロールに保存する方法

// viewをimageに変換しカメラロールに保存する
func save() {
    
    // viewをimageとして取得
    let image : UIImage = self.viewToImage(view) 
    
    // カメラロールに保存する
    UIImageWriteToSavedPhotosAlbum(image,
                                   self,
                                   #selector(self.didFinishSavingImage(_:didFinishSavingWithError:contextInfo:)),
                                   nil)
}

// 保存を試みた結果を受け取る
@objc func didFinishSavingImage(_ image: UIImage, didFinishSavingWithError error: NSError!, contextInfo: UnsafeMutableRawPointer) {
    
    // 結果によって出すアラートを変更する
    var title = "保存完了"
    var message = "カメラロールに保存しました"
    
    if error != nil {
        title = "エラー"
        message = "保存に失敗しました"
    }
    
    let alertController = UIAlertController(title: title, message: message, preferredStyle: .alert)
    alertController.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
    self.present(alertController, animated: true, completion: nil)
}

UIImageWriteToSavedPhotosAlbum()を使用してUIImageをカメラロールに保存しています。

第3引数に画像を保存した結果を受け取れるメソッドを設定することができます。

サンプルではカメラロールに保存されたかどうかをアラートで表示するようにしています。