🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
iOS

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

Swift

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

Q&A

解決済

1回答

2170閲覧

swift CIImageに変換した時にnilになる

MasakiMatsumoto

総合スコア16

iOS

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

Swift

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

0グッド

0クリップ

投稿2019/11/05 00:16

前提・実現したいこと

UIImageからimageを取得して、フィルターを掛けて再度UIImageに戻すのは無事に成功するのですが、同じUIImageから画像を取得して、もう一度処理を行おうとするとCIImageへ変換する際にnilになります。

続けて同じ処理をやるのでなく、一旦UIImageへ画像ファイルを読み込む処理を入れると、nilになりません↓。
self.image.image = UIImage(named: "IMG_3706.jpeg") // この処理を入れる

UIImageからimageを取り出した時点はnilではありません。
ソースの「print("ciImageA:(ciImageA)")」では内容らしきものが出力されます。

CIImageにする際にnilになってると思いますが、何故だかわかりません。
ソースの「print("image:(imageA)")」ではnilです。

その後「self.image.image = UIImage(ciImage: filter.outputImage!)」でエラーが発生します。

御教授頂きたく思います。

発生している問題・エラーメッセージ

Unexpectedly found nil while unwrapping an Optional value

該当のソースコード

swift

1 2 // 二値化 3 func setMonoColor(){ 4 5 let imageA = self.image.image! 6 7 print("image:(imageA)") // ここはnilでは無い 8 9 10 let ciImageA = CIImage(image: imageA) 11 12 print("ciImageA:(ciImageA)") // ここでnilになる 13 14 let filter = CIFilter(name: "CIPhotoEffectMono")! 15 16 filter.setDefaults() 17 filter.setValue(ciImageA, forKey: kCIInputImageKey) 18 19 self.image.image = UIImage(ciImage: filter.outputImage!) 20 21 self.image.setNeedsDisplay() 22 23 }

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

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

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

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

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

takabosoft

2019/11/05 01:32

setMonoColor()の一回目は成功するが、そのまま二回目を実行すると失敗するって話ですか?
MasakiMatsumoto

2019/11/05 01:55

そうです。 ボタンで実行してるのですが、一度処理を実行して成功。再度ボタン押下するとfilter.outputImageでエラーになります。
guest

回答1

0

ベストアンサー

とりあえず動くコードを載せておきます。

swift

1 func setMonoColor() { 2 let sourceImage = self.image.image! 3 let inputImage = CIImage(cgImage: sourceImage.cgImage!) 4 5 let filter = CIFilter(name: "CIPhotoEffectMono")! 6 7 filter.setDefaults() 8 filter.setValue(inputImage, forKey: kCIInputImageKey) 9 guard let outputImage = filter.outputImage else { return } 10 11 let context = CIContext(options: nil) 12 let cgImage = context.createCGImage(outputImage, from: outputImage.extent)! 13 let img = UIImage(cgImage: cgImage, scale: sourceImage.scale, orientation: sourceImage.imageOrientation) 14 15 self.image.image = img 16 }

理屈は忘れましたが、以前からUIImage(ciImage:)は期待通りに動かないので、CIContextを使った変換方法を多くのが人が採用していたと記憶しています。

投稿2019/11/05 01:59

takabosoft

総合スコア8356

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

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

MasakiMatsumoto

2019/11/05 02:11

早速のご回答、ありがとうございます! ご提示頂いたソースコードで無事解決しました。 CIContextを使うのですね。勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問