一尘不染

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

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中的理论部分正确,但是保存照片时不会进行转换,好像是在进行中。内部照片存储原始图像扩展名(2)当我意识到自己UIImagePickerControllerDelegate正在使用时,我能够对此进行验证

let imageData = UIImageJPEGRepresentation(image, 1.0)

代替这个

let imageData = UIImagePNGRepresentation(image)

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


阅读 150

收藏
2020-07-07

共1个答案

一尘不染

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

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

相反,我建议您返回并从“照片”框架中获取原始资产。因此,在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,则可以使用等效的ALAssetsLibraryAPI,但是思路是相同的:获取原始资产,而不是通过来回传递UIImage

2020-07-07