UIImageView不显示来自UIImagePickerController的PNG图像的透明度

我当然希望我错过了一些东西,因为我不明白为什么这样工作。 我有一个PNG图像,它有一个完全透明的背景,因为我想覆盖在UIImageView内的其他图像。

包含在XCode项目中的PNG图像都可以正常工作。 问题是,当我使用UIImagePickerController在dynamicselect这些相同的PNG图像,然后将其分配给UIImageView ,由于一些非常奇怪的原因,它不尊重它作为一个具有透明度的PNG图像,而是它添加一个白色的背景。

任何人以前见过这个,我怎么解决这个问题?

*更新#1:我决定尝试一些似乎证实我的理论的东西。 我决定把自己保存到设备上的原始PNG图像发给我自己,看看图像是以JPG格式发送给我的。 在我看来,当你将图像保存到iPhone上的照片将它转换为JPG,这是相当令人震惊的。 希望有人解决这个问题。 将原始图像testImage1.pngtestImage2.png保存到Photos中,然后通过电子邮件发回给我自己,返回为IMG_XXXX.jpgIMG_XXXX.jpg

*更新#2:我一直玩这个我们更多,发现了一些事情,并在这个过程中能够回答我自己的问题。 (1)在更新#1中,我的理论是部分正确的,但是保存照片时转换不会发生,看起来就像在飞行中一样。 内部照片存储原始图像扩展(2)我能够validation这一点,当我在我的UIImagePickerControllerDelegate实现,我正在使用

 let imageData = UIImageJPEGRepresentation(image, 1.0) 

而不是这个

 let imageData = UIImagePNGRepresentation(image) 

当我使用第二行代码时,它识别图像的原始透明属性。

是的,调用UIImageJPEGRepresentation会将生成的图像转换为不支持透明度的JPEG。

顺便说一句,如果你的意图是为了其他原因(例如上传到服务器,电子邮件等)获取NSData的图像,我会build议对UIImageJPEGRepresentationUIImagePNGRepresentation 。 他们丢失元数据,可以使资产更大,如果使用小于1的品质因数,如果遭受一些图像退化等。

相反,我build议回去,从照片框架中获取原始资产。 因此,在Swift 3:

 func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : 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) } 

如果您还必须支持iOS 7,则可以使用相同的ALAssetsLibrary API,但是这个想法是一样的:获取原始资源,而不是通过UIImage将其ALAssetsLibrary

(Swift 2翻译,请参阅此答案的以前的修订 。)

Swift 3版本的回复@Rob

 func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : 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) }