23977


CoreImageでエフェクトした画像がUIActivityViewControllerで画像保存できなくて困っています。

下記のようなコードを作りました。  
myCameraButtonAction()→myShareButtonAction()と実行する時は、ただしくカメラロールに画像保存できるのですが、  
myCameraButtonAction()→myEditButtonAction()→myShareButtonAction()と実行すると、カメラロールに画像が保存できなくなります。

シュミレーターでbreakして確認したところ、myEditButtonAction()すると、myImageView.imageの画像がQuickLookで確認すると画像が表示できなくなるようです。

CIFilterでエフェクト終わってCIImage→UIImageの箇所がおかしい気がしますが、何が悪いのかがわかりません。

ご伝授お願いします。

[code]

    class ViewController: UIViewController , UINavigationControllerDelegate , UIImagePickerControllerDelegate {
    
        override func viewDidLoad() {
            super.viewDidLoad()
            // Do any additional setup after loading the view, typically from a nib.
        }
    
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            // Dispose of any resources that can be recreated.
        }
    
        @IBOutlet weak var myImageView: UIImageView!
    
        @IBAction func myCameraButtonAction(sender: AnyObject) {
            let alertController = UIAlertController(title: "画像選択", message: "取得先を選択してください", preferredStyle: .ActionSheet)
            if UIImagePickerController.isSourceTypeAvailable(.Camera) {
                let camraAction = UIAlertAction(title: "カメラ", style: .Default) { (UIAlertAction) -> Void in
                    let ipc : UIImagePickerController = UIImagePickerController()
                    ipc.sourceType = .Camera
                    ipc.delegate = self
                    self.presentViewController(ipc, animated: true, completion: nil)
                }
                alertController.addAction(camraAction)
            }
    
            if UIImagePickerController.isSourceTypeAvailable(.PhotoLibrary) {
                let camraLibraryAction = UIAlertAction(title: "フォトライブラリー", style: .Default) { (UIAlertAction) -> Void in
                    let ipc : UIImagePickerController = UIImagePickerController()
                    ipc.sourceType = .PhotoLibrary
                    ipc.delegate = self
                    self.presentViewController(ipc, animated: true, completion: nil)
                }
                alertController.addAction(camraLibraryAction)
            }
            let cancelAction = UIAlertAction(title: "キャンセル", style: .Cancel, handler: nil)
            alertController.addAction(cancelAction)
            presentViewController(alertController, animated: true, completion: nil)
        }
    
        @IBAction func myShareButtonAction(sender: AnyObject) {
            if myImageView.image != nil {
                let controller = UIActivityViewController(activityItems: [myImageView.image!], applicationActivities: nil)
                presentViewController(controller, animated: true, completion: nil)
            }
        }
    
        @IBAction func myEditButtonAction(sender: AnyObject) {
            if myImageView.image != nil {
                let rotate = myImageView.image!.imageOrientation
                let inputImage = CIImage(image: myImageView.image)
                let sepiaFilter = CIFilter(name: "CISepiaTone")!
                sepiaFilter.setValue(inputImage, forKey: kCIInputImageKey)
                sepiaFilter.setValue(myEffectAdjustSlider.value, forKey: "inputIntensity")
                let outputImage = sepiaFilter.outputImage
                myImageView.image = UIImage(CIImage: outputImage!, scale: 1.0, orientation: rotate)
            }
        }
    
        func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
            myImageView.image = info[UIImagePickerControllerOriginalImage] as? UIImage
            dismissViewControllerAnimated(true, completion: nil)
        }
    }
    
[/code]


CC BY-SA 3.0
2016-04-12T16:17:55.570
23972
2016-04-13T00:27:00.833
5343
question
ios swift swift2
CoreImageでエフェクトした画像がUIActivityViewControllerで画像保存できない


わかりやすい公式ドキュメントは見つけられなかったのですが、本家のこちらのQAと同じ原因だと思われます。  
[UIImageWriteToSavedPhotosAlbum() doesn't save cropped
image](https://stackoverflow.com/questions/16400805/uiimagewritetosavedphotosalbum-
doesnt-save-cropped-image)  
「CIImageは画像じゃない、CIImageから作ったUIImageも画像じゃない」なんて意味の事が承認された回答に書いてあるんですが、要はCIImageってのは「画像を処理するためのレシピ」をパッケージ化したもので、レンダリングしてやるまでは画像は無いってことのようです。  
[Core Image Programming
Guide](https://developer.apple.com/library/ios/documentation/GraphicsImaging/Conceptual/CoreImaging/ci_intro/ci_intro.html#//apple_ref/doc/uid/TP30001185)  
\- [Getting the Output
Image](https://developer.apple.com/library/ios/documentation/GraphicsImaging/Conceptual/CoreImaging/ci_tasks/ci_tasks.html#//apple_ref/doc/uid/TP30001185-CH3-SW10)  
(だとしても、そのUIImageをUIImageViewのimageプロパティに設定すればレンダリングした結果を表示出来ちゃうんだから、保存もできて良いような気がしますが…。)

とりあえず、上記本家stackoverflowの回答にあるようにいったんCGImageを作成し、それを元にしたUIImageを渡せば保存できるようになると思います。

[code]

                let ciContext = CIContext(options: nil)
                let cgImage = ciContext.createCGImage(outputImage!, fromRect: outputImage!.extent)
                let editedImage = UIImage(CGImage: cgImage, scale: 1.0, orientation: rotate)
                myImageView.image = editedImage
    
[/code]

お試しください。  
(UIImageViewというview要素のプロパティをデータの置き場に使うというのはちょっと気になるんですが、とりあえず動くようなのでそこはそのままにしておきました。)

* * *

なお、あなたのコードをそのまま試そうとしたら、2箇所ほどエラーが出てコンパイルができませんでした。「思っているような結果が出ない」という事象の原因は「思ってもいないところにある」ことがよくあります。明らかに無関係と思われる部分を省略する場合でも、確実に問題の事象が発生させられることが確認されたコードを掲載された方が、早く解決に結びつくものです。今後またご質問を書かれる機会があればご留意ください。


CC BY-SA 3.0
2016-04-13T00:27:00.833
23977
2016-04-13T00:27:00.833
2017-05-23T12:38:56.467
-1
13972
23972
answer