カテゴリー: iOS

[Swift]UIViewからUIImageを作成しローカルに保存

はじめに

こんにちは、nukkyです。
今回は案件で画面の一部分を画像にして保存する対応を行ったので、備忘録がてら書いていきたいと思います。

前提条件

Xcode 9.1
iOS 11 Simulator
Swift 4.0

 

実装

UIViewからUIImageへ

別プロジェクトでもコピペで呼びやすいようにUIViewのextensionで作成しました。
コードは以下になります。

extension UIView {
    
    func GetImage() -> UIImage{
        
        // キャプチャする範囲を取得.
        let rect = self.bounds
        
        // ビットマップ画像のcontextを作成.
        UIGraphicsBeginImageContextWithOptions(rect.size, false, 0.0)
        let context: CGContext = UIGraphicsGetCurrentContext()!
        
        // 対象のview内の描画をcontextに複写する.
        self.layer.render(in: context)
        
        // 現在のcontextのビットマップをUIImageとして取得.
        let capturedImage : UIImage = UIGraphicsGetImageFromCurrentImageContext()!

        // contextを閉じる.
        UIGraphicsEndImageContext()
        
        return capturedImage
    }
}

UIImageをローカルに保存

続いてUIImageをローカルに保存するコードになります。
今回はpngで保存する場合のコードですが、jpgで保存する場合のコードもコメントアウトで残してあります。

private func saveImage (image: UIImage, fileName: String ) -> Bool{
    //pngで保存する場合
    let pngImageData = UIImagePNGRepresentation(image)
    // jpgで保存する場合
//    let jpgImageData = UIImageJPEGRepresentation(image, 1.0)
    let documentsURL = FileManager.default.urls(for: .libraryDirectory, in: .userDomainMask)[0]
    let fileURL = documentsURL.appendingPathComponent(fileName)
    do {
        try pngImageData!.write(to: fileURL)
    } catch {
        //エラー処理
        return false
    }
    return true
}

おまけ:画像のリサイズ

画像を保存するのにあたって、画像サイズを小さくしたくなったのでアス比を維持してリサイズを行う処理を書きました。
ちょっと分かりづらいかもですが、横に長い画像ならwのサイズに、縦が長い画像ならhのサイズにアス比を維持して画像のリサイズをします。

func resizeImage(image :UIImage, w:Int, h:Int) ->UIImage
{
    // アスペクト比を維持
    let origRef    = image.cgImage
    let origWidth  = Int(origRef!.width)
    let origHeight = Int(origRef!.height)
    var resizeWidth:Int = 0, resizeHeight:Int = 0
    if (origWidth < origHeight) {
        resizeWidth = w
        resizeHeight = origHeight * resizeWidth / origWidth
    } else {
        resizeHeight = h
        resizeWidth = origWidth * resizeHeight / origHeight
    }
    
    let resizeSize = CGSize.init(width: CGFloat(resizeWidth), height: CGFloat(resizeHeight))
    
    UIGraphicsBeginImageContextWithOptions(resizeSize, false, 0.0)
    
    image.draw(in: CGRect.init(x: 0, y: 0, width: CGFloat(resizeWidth), height: CGFloat(resizeHeight)))
    
    let resizeImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    
    return resizeImage!
}

 

 

さいごに

これでUIViewからUIImage、それをpngもしくはjpgで保存、ついでにリサイズと一通りの流れはできているかと思います。
同じ様な処理を作成したい方の一助となれれば嬉しいです。

おすすめ書籍

     

nukky

シェア
執筆者:
nukky
タグ: Swift

最近の投稿

フロントエンドで動画デコレーション&レンダリング

はじめに 今回は、以下のように…

2週間 前

Goのクエリビルダー goqu を使ってみる

はじめに 最近携わっているとあ…

4週間 前

【Xcode15】プライバシーマニフェスト対応に備えて

はじめに こんにちは、suzu…

2か月 前

FSMを使った状態管理をGoで実装する

はじめに 一般的なアプリケーシ…

3か月 前