44862


現在、imagePickerControllerでカメラロールから選択した画像を、UIImageViewで画面に表示させる実装をしているのですが、以下の背景透明のpng画像を表示すると、背景が黒く表示されてしまいます。  
背景を透明のままで表示したいのですが、どのようにすればよろしいでしょうか？  
[![png画像](https://i.stack.imgur.com/O2Y5J.png)](https://i.stack.imgur.com/O2Y5J.png)

以下追記  
storyboardは、カメラロールを呼び出すためのボタンだけ追加した以下のもので行っています。  
[![storyboard](https://i.stack.imgur.com/GbE1W.png)](https://i.stack.imgur.com/GbE1W.png)

このstoryboardに、TestViewControllerをつけています。TestViewControllerは以下のコードです。

[code]

    import Foundation
    import UIKit
    
    class TestViewController: UIViewController {
        var imageView: UIImageView?
    
        override func viewDidLoad() {
            super.viewDidLoad()
            self.view.backgroundColor = UIColor.white
        }
    
        @IBAction func test(_ sender: UIButton) {
            openPhoto()
        }
    
    }
    
    extension TestViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate {
        func openPhoto() {
            let sourceType:UIImagePickerControllerSourceType = UIImagePickerControllerSourceType.photoLibrary
            // カメラが利用可能かチェック
            if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.photoLibrary) {
                // インスタンスの作成
                let cameraPicker = UIImagePickerController()
                cameraPicker.sourceType = sourceType
                cameraPicker.delegate = self
                cameraPicker.allowsEditing = true
                self.present(cameraPicker, animated: true, completion: nil)
            }
        }
    
        func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
            if let pickedImage = info[UIImagePickerControllerEditedImage] as? UIImage {
                self.imageView = UIImageView()
                self.imageView?.frame = CGRect(x: 0, y: 0, width: 100, height: 100)
                self.imageView?.image = pickedImage
                self.imageView?.center = self.view.center
                self.imageView?.isOpaque = false
                self.imageView?.backgroundColor = UIColor.white
                self.view.addSubview(self.imageView!)
            }
    
            // カメラ画面(アルバム画面)を閉じる処理
            picker.dismiss(animated: true, completion: nil)
        }
    }
    
[/code]

この状態で、カメラロールからpng画像を選択して、動的に生成したUIImageViewで表示すると、以下のように背景が黒く表示されます。  
[![背景黒い](https://i.stack.imgur.com/0JYim.png)](https://i.stack.imgur.com/0JYim.png)


CC BY-SA 4.0
2018-06-17T11:34:43.487
44824
2019-05-06T14:02:28.580
2018-06-17T15:25:05.020
27638
27638
question
swift
取り込んだpngの背景を透明にしたい


Appleのドキュメントを見たところデフォルトで透明値が使われるそうです.  
つまり透明にはすでになっています.  
デフォルトの背景色が黒のようなので透明になって黒が表示されているのではないでしょうか.  
親要素の背景を白にしてみてください.


CC BY-SA 4.0
2018-06-17T12:01:51.633
44825
2018-06-17T12:01:51.633
12216
44824
answer


一部機能を削らないといけない上、明記されたドキュメントが見つけられなかったので、確実な解決策とは言いにくいんですが、一応iOS 11.4
Simulatorでは透明部分を有効にすると言う動作は確認出来たので、回答として書かせていただきます。

結論としては`allowsEditing`で`UIImagePickerController`で画像を選択した時の編集機能をあきらめて、オリジナルの画像`UIImagePickerControllerOriginalImage`をそのまま使用して下さい、と言うことになります。

`UIImagePickerController`が元画像を加工して返す場合には、alpha値が失われ、不透明の真っ黒になってしまう、なんて挙動をすることが報告されています。(この辺りの挙動のドキュメントは見つけることができませんでした。)([参考リンク](https://stackoverflow.com/q/8024543/6541007))

なお、今回の件には直接の関係はありませんが、あなたのコードでは`addSubview`で、viewに付け加えた子ビューを削除する処理がどこにも入っていないので、実行を続けるうちにどんどん子ビューが増えていき、ひたすら重くなっていきます。動的に`addSubview`したらどこでそのビューを削除するのかを考えておいてください。以下のコード例では、そこら辺の問題を避けるため、`imageView`をIBOutletに変更しています。(当然適切に接続しておかないと以下のコードは試せません。)

[code]

    import UIKit
    
    class TestViewController: UIViewController {
        @IBOutlet var imageView: UIImageView!
    
        override func viewDidLoad() {
            super.viewDidLoad()
            self.view.backgroundColor = .green //白だと透明で白になっているのか何かのデフォルトなのかわかりにくいので緑にしておく
            self.imageView.isOpaque = false
            self.imageView.isHidden = true //imageViewを非表示にする
        }
    
        @IBAction func test(_ sender: UIButton) {
            openPhoto()
        }
    }
    
    extension TestViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate {
        func openPhoto() {
            let sourceType = UIImagePickerControllerSourceType.photoLibrary
            // photoLibraryが利用可能かチェック
            if UIImagePickerController.isSourceTypeAvailable(sourceType) {
                // インスタンスの作成
                let imagePicker = UIImagePickerController()
                imagePicker.sourceType = sourceType
                imagePicker.delegate = self
                self.present(imagePicker, animated: true, completion: nil)
            }
        }
    
        func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
            if let pickedImage = info[UIImagePickerControllerOriginalImage] as? UIImage {
                self.imageView.image = pickedImage
                self.imageView.isHidden = false //imageViewを表示する
            }
    
            // カメラ画面(アルバム画面)を閉じる処理
            picker.dismiss(animated: true, completion: nil)
        }
    }
    
[/code]

実行例:  
[![透明部のある画像の表示例](https://i.stack.imgur.com/cXXNQ.png)](https://i.stack.imgur.com/cXXNQ.png)

`UIImagePickerController`は本来透明なんて概念のない写真画像を引っ張ってくることを目的にしているので、編集機能を有効にしたままalpha値の有効なままにしておくのは、かなり難しいのではないかと思います。


CC BY-SA 4.0
2018-06-18T15:17:56.983
44862
2018-06-18T15:17:56.983
13972
44824
answer


こんにちは。  
私も画像を透明化することを検索していてここにたどり着きました。  
初心者で、この記事をみてもcodeの理解が難しいです。  
勉強します。

話がそれました。  
ずいぶん前の投稿でもう必要ないかもしれないし、ピントがずれた回答かもしれませんが、  
一応書いてみます。

**codeのせいではない、アップしたpng画像に問題がある？**

私がブロク投稿で、pngで透過していたときに経験したことです。  
あるソフトで透過してpngで保存して、他のソフトで開くと透過させたのに黒く表示されることがありました。  
どのソフトか忘れたのですが、たとえばJTrimで透過して、ペイントで開いたら背景まっくろ。  
エクセルで透過して、ペイントで開いたら背景は白と、使うソフトによって違っていました。

やってみてほしいのが、エクセルで透過して、その画像を何かのソフトに貼り付けて、  
ｐｎｇ形式で保存してアップロードする。  
まだ黒くなるときは、透過させるソフトをかえてみる。

まと外れだったら、ごめんなさい。


CC BY-SA 4.0
2019-05-06T14:02:28.580
54781
2019-05-06T14:02:28.580
34205
44824
answer