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

Lav*_*vvo 6 png uiimageview uiimagepickercontroller ios swift

我当然希望我错过了一些东西,因为我不明白为什么这样做会有所改变.我有一个PNG图像,它具有完全透明的背景,因为我想将它叠加在一个内部的其他图像上UIImageView.

XCode项目中包含的PNG图像都可以正常工作.问题是当我在运行中选择这些相同的PNG图像UIImagePickerController然后将其分配给它时UIImageView,出于一些非常奇怪的原因,它不会将其视为具有透明度的PNG图像,而是添加白色背景.

以前见过这个的人怎么解决这个问题?

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

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

let imageData = UIImageJPEGRepresentation(image, 1.0)
Run Code Online (Sandbox Code Playgroud)

而不是这个

let imageData = UIImagePNGRepresentation(image)
Run Code Online (Sandbox Code Playgroud)

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

Rob*_*Rob 8

是的,调用UIImageJPEGRepresentation将把结果图像转换为JPEG,不支持透明度.

顺便说一句,如果您的目的是NSData出于其他原因(例如上传到服务器,发送电子邮件等)获取图像,我建议不要同时使用UIImageJPEGRepresentationUIImagePNGRepresentation.如果使用小于1的品质因数等,它们会丢失元数据,可能会使资产变大,如果遭受一些图像质量下降等.

相反,我建议回去并从Photos框架中获取原始资产.因此,在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)
}
Run Code Online (Sandbox Code Playgroud)

如果您还必须支持iOS 7,那么您将使用等效的ALAssetsLibraryAPI,但这个想法是相同的:获取原始资产而不是通过UIImage.

(对于Swift 2的演绎,请参阅此答案的先前修订版.)