UIImagePickerController将透明PNG视为JPEG

时间:2018-03-12 19:02:45

标签: ios swift uiimagepickercontroller transparency

这在某种程度上建立在question之前,但我正在制定一个解决方案,允许用户通过UIImagePickerController从照片库中选择图像,如果是这样的话是一个具有透明度的.png,用于保持图像的透明度以便在UIImageView中显示。

我可以使用以下步骤不断复制我的问题;

  • 将我的image导入我的Mac上的照片。
  • 允许我的图片通过iCloud同步到iOS设备上的照片。
  • 尝试使用以下代码在我的应用中加载我的图片;

-

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {

    if let pickedImage = info[UIImagePickerControllerOriginalImage] as? UIImage {

       let png = UIImagePNGRepresentation(pickedImage)
       let pngImage = UIImage(data: png!)


       // TEST FILE TYPE
       if let fileURL = info[UIImagePickerControllerImageURL] as? URL { 
            // CONSISTENTLY PRINTS PUBLIC.JPEG   
            print(fileURL.typeIdentifier)    
        }
    }
}

无论出于何种原因,将图像导入照片的过程会导致iOS将图像看作JPEG而不是PNG,因此在UIImageView中测试时会失去透明度。文件名仍然是.png,但在应用程序中使用是不可行的。

顺便说一句,如果我将transparent.png带入我的Xcode项目,并将我的UIImageView设置为imageView.image = UIImage(named: "newTest.png"),则透明度功能完全正常。

更新:这似乎是在iOS 11上无法重现的问题.SO和其他留言板上的其他用户已经确认了这种情况。目前,我建议的解决方法是识别从外部源下载透明PNG而不是从用户的照片库加载的解决方案。重启iOS设备似乎确实可以在一段不确定的时间内解决问题。

1 个答案:

答案 0 :(得分:0)

确保iCloud Photo Library的optimize设置已关闭:

  

在iPhone,iPad或iPod touch上:

     
      
  1. 点按设置> [你的名字]> iCloud中。如果您使用的是iOS 10.2或更早版本,请点按设置> icloud的。
  2.   
  3. 点击照片。
  4.   
  5. 选择优化[设备]存储。
  6.         

    在Mac上:

         
        
    1. 打开照片应用,然后点击菜单栏中的照片。
    2.   
    3. 点击偏好设置。
    4.   
    5. 转到iCloud选项卡并选择存储设置。
    6.   

如果已启用,则必须在关闭照片库后将其重新添加到照片库中,以保留原始照片。