我当然希望我错过了一些东西,因为我不明白为什么这样做会起作用。我有一个PNG图片,它具有完全透明的背景,因为我想将其覆盖在UIImageView
内的其他图片上。
XCode项目中包含的PNG图像都可以正常工作。问题是,当我使用UIImagePickerController
即时选择这些相同的PNG图像,然后将其分配给UIImageView
时,出于某些非常奇怪的原因,它没有将其视为具有透明性的PNG图像,而是添加了白色背景。
有人以前见过这个,我该如何解决?
*更新#1:我决定尝试尝试一些可以证实我理论的事情。我决定通过电子邮件将保存到设备中的原始PNG图像通过电子邮件发送给我,瞧瞧,这些图像以JPG的形式出现在我身上。在我看来,当您将图像保存到iPhone上的“照片”时,它会将其转换为JPG,这让我感到非常震惊。希望有人能解决这个问题。原始图像testImage1.png
和testImage2.png
保存到“照片”,然后通过电子邮件发送给我自己,分别作为IMG_XXXX.jpg
和IMG_XXXX.jpg
返回
*更新#2:我继续玩这个游戏,发现了一些东西,在此过程中能够回答我自己的问题。 (1)我在UPDATE#1中的理论部分正确,但是在保存照片时不会进行转换,好像它在进行中。内部照片存储原始图像扩展名(2)当我在使用的UIImagePickerControllerDelegate
中意识到时,我能够对此进行验证
let imageData = UIImageJPEGRepresentation(image, 1.0)
代替这个
let imageData = UIImagePNGRepresentation(image)
当我使用第二行代码时,它正在识别图像的原始透明度属性。
最佳答案
是的,对UIImageJPEGRepresentation
的调用会将生成的图像转换为JPEG,不支持透明性。
顺便说一句,如果出于其他原因(例如,上传到服务器,通过电子邮件发送等),如果您打算为图像获取NSData
,则建议不要同时使用UIImageJPEGRepresentation
和UIImagePNGRepresentation
。如果使用小于1的品质因数,它们会丢失元数据,可能会使 Assets 变大,如果图像质量下降,等等。
相反,我建议您返回并从“照片”框架中获取原始 Assets 。因此,在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,但思路是相同的:获取原始 Assets ,而不是通过UIImage
对其进行双向处理。(有关Swift 2再现,请参见previous revision of this answer。)