教えてください!
UIImage を描画し、それを 360pixel×360pixel の CGImage に変換した上で、配列に格納するために、以下のようなコードを書いています。
配列に格納する枚数が数百枚単位になるので、シミュレータで見ると、メモリの使用量が3Gを超えます。
実機でテストすると、メモリ不足でアプリが落ちます。
これを回避する方法はあるのでしょうか?
for i in 0...bridgeArray.count - 1{ //bridgeArray[i]が空だったら、imageArrayForGifには現状の画像を加え、空じゃなかったら、DrawDataをbridgeArray[i]に入ってる個数分読んで描画し、imageArrayForGifに加える if bridgeArray[i].isEmpty == true{ imageView.image = canvasForGifInView canvasInImageArrayForGif = resizeUIImage(canvasForGifInView,scale) let canvasForGifCGImage = canvasInImageArrayForGif.cgImage imageArrayForGif.append(canvasForGifCGImage!) }else{ strokeDataForGif = bridgeArray[i] for k in 0...bridgeArray[i].count - 1{ drawDataForGif = strokeDataForGif[k] midPoint1 = convertPointInImageToPointInView(drawDataForGif.MidPoint1) midPoint2 = convertPointInImageToPointInView(drawDataForGif.MidPoint2) lastPoint = convertPointInImageToPointInView(drawDataForGif.LastPoint) canvasForGifInView = drawCurves(image: canvasForGifInView, fromPoint: midPoint1, toPoint: midPoint2, controlPoint: lastPoint) } imageView.image = canvasForGifInView canvasInImageArrayForGif = resizeUIImage(canvasForGifInView,scale) let canvasForGifCGImage = canvasInImageArrayForGif.cgImage imageArrayForGif.append(canvasForGifCGImage!) } }
//線の描画 func drawCurves(image:UIImage, fromPoint:CGPoint, toPoint:CGPoint, controlPoint:CGPoint) -> UIImage{ UIGraphicsBeginImageContextWithOptions(imageView.bounds.size,true,0.0) image.draw(in: CGRect(x:0,y:0,width:imageView.bounds.width,height:imageView.bounds.height)) let context = UIGraphicsGetCurrentContext() context?.move(to:CGPoint(x:fromPoint.x,y:fromPoint.y)) context?.addQuadCurve(to:CGPoint(x:toPoint.x,y:toPoint.y),control:CGPoint(x:controlPoint.x,y:controlPoint.y)) context?.setBlendMode(CGBlendMode.normal) context?.setLineCap(CGLineCap.round) context?.setLineWidth(2 * scaleOfImageView) context?.setStrokeColor(UIColor(red:1.0,green:1.0,blue:1.0,alpha:1).cgColor) context?.strokePath() let drewImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return drewImage! }
アニメーションGIFでも作ろうとしているんですか?
そうなんです
360pixel×360pixelとなっていますが、Retinaディスプレイで実解像度が720pixel×720pixelってことになるんですか?
retina が 2 なのか 3 なのかっていう scale も取得してリサイズしているので、360pixel × 360pixelです。
つまり、resizeUIImage()のscale引数がそのままUIGraphicsBeginImageContextWithOptions()のscale引数にはなっていない、ということですね?
んーと、resizeUIImage()では、UIImage を 360/scale の大きさにして、それを CGImage に変換しています。
速度が求められる処理ですか?もしそれほどでもなければメモリでなくストレージを利用する手もあるかと思いますが。
速度はそんなに求めてないです!ストレージを利用するにはどうすればいいのでしょうか??
回答1件
あなたの回答
tips
プレビュー