UIImageView ne montre pas la transparence des images PNG de UIImagePickerController

J'espère sûrement que je manque quelque chose parce que je ne comprends pas pourquoi cela fonctionne comme il le fait. J'ai une image PNG, qui a un fond entièrement transparent parce que je veux le superposer sur d'autres images à l'intérieur d'un UIImageView .

Les images PNG incluses dans le projet XCode fonctionnent correctement comme elles le devraient. Le problème est quand je sélectionne ces mêmes images PNG à la volée en utilisant UIImagePickerController et en l'assignant à UIImageView , pour une raison vraiment bizarre, il ne le respecte pas comme une image PNG avec transparence et à la place il ajoute un fond blanc.

Quelqu'un a-t-il déjà vu cela et comment puis-je contourner cela?

* MISE À JOUR # 1: J'ai décidé d'essayer quelque chose qui semble confirmer ma théorie. J'ai décidé de m'envoyer par e-mail les images PNG d'origine que j'avais enregistrées sur mon appareil et voici, les images sont arrivées au format JPG. Il me semble que lorsque vous enregistrez une image sur Photos sur iPhone, il la convertit en JPG, c'est plutôt choquant pour moi. J'espère que quelqu'un a un moyen de contourner cela. Les images originales testImage1.png et testImage2.png enregistrées dans Photos puis renvoyées par e-mail à moi-même, returnnées sous IMG_XXXX.jpg et IMG_XXXX.jpg

* MISE À JOUR # 2: J'ai continué à jouer autour de nous plus et j'ai découvert quelques choses et dans le process était en mesure de répondre à ma propre question. (1) Ma théorie dans UPDATE # 1 est partiellement correcte, mais la conversion ne se produit pas lors de l'logging de la photo, semble être à la volée. En interne, les photos stockent l'extension de l'image originale (2) J'ai pu valider cela quand j'ai réalisé dans mon UIImagePickerControllerDelegate que j'utilisais

 let imageData = UIImageJPEGRepresentation(image, 1.0) 

au lieu de cela

 let imageData = UIImagePNGRepresentation(image) 

Lorsque j'ai utilisé la deuxième ligne de code, il reconnaissait les propriétés de transparence d'origine de l'image.

Oui, l'appel à UIImageJPEGRepresentation convertira l'image résultante en JPEG, ce qui ne prend pas en charge la transparence.

BTW, si votre intention est d'get le NSData pour l'image pour d'autres raisons (par exemple en téléchargeant sur le server, emailing, etc.), je reorderais à la fois UIImageJPEGRepresentation et UIImagePNGRepresentation . Ils perdent des méta-données, peuvent rendre l'actif plus grand, s'ils souffrent de dégradation de l'image si vous utilisez un facteur de qualité inférieur à 1, etc.

Au lieu de cela, je vous recommand de revenir en arrière et d'get l'élément d'origine à partir du cadre Photos. Ainsi, dans Swift 3:

 func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [Ssortingng : Any]) { if let url = info[UIImagePickerControllerReferenceURL] as? URL { let result = PHAsset.fetchAssets(withALAssetURLs: [url], options: nil) if let asset = result.firstObject { let manager = PHImageManager.default() manager.requestImageData(for: asset, options: nil) { imageData, dataUTI, orientation, info in if let fileURL = info!["PHImageFileURLKey"] as? URL { let filename = fileURL.lastPathComponent // use filename here } // use imageData here } } } picker.dismiss(animated: true) } 

Si vous devez également prendre en charge iOS 7, vous utiliserez l'API ALAssetsLibrary équivalente, mais l'idée est la même: récupérez l'élément d'origine plutôt que de le sortinger dans un UIImage .

(Pour le rendu de Swift 2, voir la révision précédente de cette réponse .)

Swift 3 version de réponse par @Rob

 func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [Ssortingng : Any]) { if let URL = info[UIImagePickerControllerReferenceURL] as? NSURL { let result = PHAsset.fetchAssets(withALAssetURLs: [URL as URL], options: nil) if let asset:PHAsset = result.firstObject! as PHAsset { let manager = PHImageManager.default() manager.requestImageData(for: asset, options: nil) { imageData, dataUTI, orientation, info in let fileURL = info!["PHImageFileURLKey"] as? NSURL let filename = fileURL?.lastPathComponent; // use imageData here } } } picker.dismiss(animated: true, completion: nil) }