はじめに
こんにちは、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 | extensionUIView{ funcGetImage()->UIImage{ // キャプチャする範囲を取得. letrect=self.bounds // ビットマップ画像のcontextを作成. UIGraphicsBeginImageContextWithOptions(rect.size,false,0.0) letcontext:CGContext=UIGraphicsGetCurrentContext()! // 対象のview内の描画をcontextに複写する. self.layer.render(in:context) // 現在のcontextのビットマップをUIImageとして取得. letcapturedImage:UIImage=UIGraphicsGetImageFromCurrentImageContext()! // contextを閉じる. UIGraphicsEndImageContext() returncapturedImage } } |
UIImageをローカルに保存
続いてUIImageをローカルに保存するコードになります。
今回はpngで保存する場合のコードですが、jpgで保存する場合のコードもコメントアウトで残してあります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | private funcsaveImage(image:UIImage,fileName:String)->Bool{ //pngで保存する場合 letpngImageData=UIImagePNGRepresentation(image) // jpgで保存する場合 // let jpgImageData = UIImageJPEGRepresentation(image, 1.0) letdocumentsURL=FileManager.default.urls(for:.libraryDirectory,in:.userDomainMask)[0] letfileURL=documentsURL.appendingPathComponent(fileName) do{ trypngImageData!.write(to:fileURL) }catch{ //エラー処理 returnfalse } returntrue } |
おまけ:画像のリサイズ
画像を保存するのにあたって、画像サイズを小さくしたくなったのでアス比を維持してリサイズを行う処理を書きました。
ちょっと分かりづらいかもですが、横に長い画像なら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 | funcresizeImage(image:UIImage,w:Int,h:Int)->UIImage { // アスペクト比を維持 letorigRef =image.cgImage letorigWidth =Int(origRef!.width) letorigHeight=Int(origRef!.height) varresizeWidth:Int=0,resizeHeight:Int=0 if(origWidth<origHeight){ resizeWidth=w resizeHeight=origHeight*resizeWidth/origWidth }else{ resizeHeight=h resizeWidth=origWidth*resizeHeight/origHeight } letresizeSize=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))) letresizeImage=UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() returnresizeImage! } |
さいごに
これでUIViewからUIImage、それをpngもしくはjpgで保存、ついでにリサイズと一通りの流れはできているかと思います。
同じ様な処理を作成したい方の一助となれれば嬉しいです。