Lav*_*vvo 6 png uiimageview uiimagepickercontroller ios swift
我当然希望我错过了一些东西,因为我不明白为什么这样做会有所改变.我有一个PNG图像,它具有完全透明的背景,因为我想将它叠加在一个内部的其他图像上UIImageView.
XCode项目中包含的PNG图像都可以正常工作.问题是当我在运行中选择这些相同的PNG图像UIImagePickerController然后将其分配给它时UIImageView,出于一些非常奇怪的原因,它不会将其视为具有透明度的PNG图像,而是添加白色背景.
以前见过这个的人怎么解决这个问题?
*更新#1:我决定尝试一些似乎证实我的理论的东西.我决定给自己发送电子邮件给我保存到我设备上的原始PNG图像,并且看到这些图像以JPG的形式传给我.在我看来,当你将图像保存到iPhone上的照片时它将它转换为JPG,这对我来说相当震撼.希望有人能解决这个问题.原始图像testImage1.png和testImage2.png保存照片,然后通过电子邮件发送回自己,返回IMG_XXXX.jpg和IMG_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)
当我使用第二行代码时,它识别出图像的原始透明属性.
是的,调用UIImageJPEGRepresentation将把结果图像转换为JPEG,不支持透明度.
顺便说一句,如果您的目的是NSData出于其他原因(例如上传到服务器,发送电子邮件等)获取图像,我建议不要同时使用UIImageJPEGRepresentation和UIImagePNGRepresentation.如果使用小于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的演绎,请参阅此答案的先前修订版.)
| 归档时间: |
|
| 查看次数: |
3373 次 |
| 最近记录: |