はじめに
こんにちは、nukkyです。
今回は案件で画面の一部分を画像にして保存する対応を行ったので、備忘録がてら書いていきたいと思います。
前提条件
Xcode 9.1
iOS 11 Simulator
Swift 4.0
実装
UIViewからUIImageへ
別プロジェクトでもコピペで呼びやすいようにUIViewのextensionで作成しました。
コードは以下になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 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で保存する場合のコードもコメントアウトで残してあります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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のサイズにアス比を維持して画像のリサイズをします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | 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で保存、ついでにリサイズと一通りの流れはできているかと思います。
同じ様な処理を作成したい方の一助となれれば嬉しいです。