問題
UIImageを好きなサイズ(CGRectを指定)にcropするのをお助けください。
エラー文に非常に困っております。
下記に自分の方法を示してありますが、全く違くてもっと良い方法がありましたらご教授ください。
やろうとしていること
1.カメラから得たCvPixelBufferをCIImageにする
2.さらにそれをUIImageにする。(最終的にUIImageとして出力が欲しいので)
3.先ほどのUIImageにCGRectを指定してcropする
表示されているエラー文
swift
1Fatal error: Unexpectedly found nil while unwrapping an Optional value
コード
swift
1self.videoImage = CIImage(cvPixelBuffer: videoPixelBuffer) 2let scale = 3.008 // self.videoImage.size.width / self.view.bounds.widthの結果 3let image = UIImage(ciImage: self.videoImage!, scale: CGFloat(scale), orientation: .up) 4let cropped = self.cropImage(image: image, cropRect: CGRect(x: 0, y: 0, width: 100, height: 100)) //CGRectはとりあえずこう決めました 5 6func cropImage(image:UIImage, cropRect:CGRect) -> UIImage { 7 let cropRef = image.cgImage!.cropping(to: cropRect) //ここでエラー文発生 8 let cropImage = UIImage(cgImage: cropRef!, scale: image.scale, orientation: image.imageOrientation) 9 10 return cropImage 11 }
追記
xcode 11.4
ビデオキャプチャの引用:https://github.com/shu223/DepthBook/tree/master/02_DepthInRealTime
cropImageの引用:http://galakutaapp.blogspot.com/2017/05/blog-post_18.html
追加情報
self.videoImage.sizeの出力は(1128, 1504)
image.sizeの出力は(375, 500です)
scale = 3.008倍だけ違います
色々と動かしてみたところ以下のことが分かりました。
インターネットから拾ってきた画像で同じコートを動かしたところちゃんと動きました。
なので私が上記のコードで用意したUIImageがおかしいことになります。
Swift
1self.videoImage = CIImage(cvPixelBuffer: videoPixelBuffer) 2let scale = 3.008 // self.videoImage.size.width / self.view.bounds.widthの結果 3let image = UIImage(ciImage: self.videoImage!, scale: CGFloat(scale), orientation: .up)
これで用意したUIImageだとcropすることはできません。なぜでしょうか泣
試しに上記の画像を保存する機能を付けましたが、保存されませんでした。
つまるところ、"let image"はUIImageViewには表示できるのに保存も読み込みもできないという謎状態です。
こちらの問題において本質的なところだけを取り出して再度整理してuploadしたのでもしよければこちらも見てください。
https://teratail.com/questions/251948
あなたの回答
tips
プレビュー