質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

0回答

661閲覧

UIImageをcropする方法と発生するエラー

chestnutforest

総合スコア9

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

1クリップ

投稿2020/04/06 13:11

編集2020/04/07 06:11

問題
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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ch3cooh

2020/04/07 00:17

> Fatal error: Unexpectedly found nil while unwrapping an Optional value ``` let cropRef = image.cgImage!.cropping(to: cropRect) ``` の、`image.cgImage` がnilで返ってきているのが原因と思われます。入力した画像に問題があるのではないかと思いますが、コードの全貌が見えないので原因はわかりません。 もし検証するのであれば、デバッガーで戻り値を確認する、または下記コードのようにすると abort() でクラッシュさせることで確認できます。 ``` func cropImage(image:UIImage, cropRect:CGRect) -> UIImage? { guard let cgImage = image.cgImage, let cropRef = cgImage.cropping(to: cropRect) else { abort() } let cropImage = UIImage(cgImage: cropRef, scale: image.scale, orientation: image.imageOrientation) return cropImage } ```
chestnutforest

2020/04/07 04:41 編集

https://github.com/shu223/DepthBook/tree/master/02_DepthInRealTimeこちらのshu223さんのコードのDispatchQueue.main.asyncに上記のコードを付け足しただけのコードです。 今回の動作で関係あるのは私が質問蘭に書いた部分のみです。 入力画像のサイズはimage.sizeの出力は(375, 500)となっていることをprintして確認してあります。 かつ、UIImageViewにも表示させてしっかりとnilでもないことも確認してあります。 cropする範囲としてはCGRect(x: 0, y: 0, width: 100, height: 100)でテストしてるのでこちらは問題ないと思われます。 なので、UIImageViewに表示させていながらも(nilではないはず)nilで帰ってくる理由が全く分かりません...... 上記のコードで試してみたのですが、abort()でクラッシュしているので、nilが帰ってきていることは確実かと思われます。 どうやら、上記のコードの場合のみ動かないらしいです。インターネットから拾ってきたランダムな画像でのcropはできました。なので上記で用意した画像に問題があるようなのですが....
hoshi-takanori

2020/04/07 22:28

CIImage から生成した UIImage はそのままでは CGImage を持たないので、一度 CGImage を生成する必要があるのでしょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問