UIImagePickerController() 确实在 UIImage 视图中显示图像很好,但在集合和表的 UIImage 视图中旋转?

Posted

技术标签:

【中文标题】UIImagePickerController() 确实在 UIImage 视图中显示图像很好,但在集合和表的 UIImage 视图中旋转?【英文标题】:UIImagePickerController() does shows image fine in UIImage view, but rotates in collection and table's UIImage view? 【发布时间】:2018-09-08 23:06:32 【问题描述】:

我很难过,希望有人能给我一些碎屑来研究。我搜索但找不到相同的问题,所以如果之前有人问过并回答过,我深表歉意。

我有一个简单的应用程序,用户可以使用以下方法将照片上传到 Parse-Server 上的帖子:

@IBAction func SelectImage(_ sender: Any) 
    let imagePicker = UIImagePickerController()
    imagePicker.delegate = self
    imagePicker.sourceType = UIImagePickerControllerSourceType.photoLibrary
    imagePicker.allowsEditing = false
    self.present(imagePicker, animated: true, completion: nil)

如果它是第一个图像,我将 UIImageView 设置为所选图像并将其添加到 PFFiles 数组中。如果它不是第一个,我只需将它添加到数组中。然后我设置了一个集合视图来显示 PFFile 数组中的所有图像。

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) 
    if let image = info[UIImagePickerControllerOriginalImage] as? UIImage 
        if !image1Set 
            blipImage.image = image
            imagePicked = true
            image1Set = true
         else if !image2Set 
            image2Set = true
         else if !image3Set 
            image3Set = true
        
        // Build an array of the files for the blip
        if let imageData = UIImagePNGRepresentation(image) 
            if let blipFile = PFFile(name: "image.png", data: imageData) 
                newBlipFiles.append(blipFile)
                blipFiles.append(blipFile)
            
        
        blipFileCollectionView.reloadData()
    
    dismiss(animated: true, completion: nil)


func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 
    let cell:BlipMainCell = collectionView.dequeueReusableCell(withReuseIdentifier: "fileCell", for: indexPath) as! BlipMainCell

    blipFiles[indexPath.row].getDataInBackground  (data, error) in
        if let imageData = data 
            if let imageToDisplay = UIImage(data: imageData) 
                cell.image.image = imageToDisplay
            
        
    
    return cell

当我在模拟器上运行它时,一切看起来都很好。当我在手机上进行测试时,尽管收藏视图中的照片将其翻转过来。一旦照片被读入服务器并且先前上传的图像被播种到同一个视图控制器中,图像就会在集合视图和最初正确显示它的 UIImageView 中翻转。当图像从服务器拉出并用作表格视图中的图标时,它也会被翻转。

我的假设是,当使用 UIImagePNGRepresentation(image) 将图像转换为数据时会发生一些事情,从而导致方向被剥离。这可以解释为什么它一直被读取为 PFFile 它被翻转而不是原始设置,但是当它播种相同的 UIImageView 时它会被翻转。

谁能帮我理解这个?在我的内心深处,我希望这就像在 PFFile 的数据编码中添加某种参数一样简单,这样 UIImagePNGRepresentation(image) 就可以保持正确的方向。非常令人沮丧,因为我不可能有一个方向与用户期望不符的应用程序,因为这是他们在相机胶卷中看到的。

谢谢,丹

【问题讨论】:

【参考方案1】:

这是因为当您将 UIImage 对象转换为 PNG 数据表示时,它会丢弃包含图像方向信息的图像 exif 元数据。解决方案是使用 JPEG 数据表示,它保留了图像方向并且还具有减小图像数据大小的优点。如果您确实需要上传 PNG,您可以在新的图像上下文中 redraw 您的图像,然后将新图像转换为数据。

【讨论】:

【参考方案2】:

问题是您拥有正确的数据,但在获取 UIImagePickerControllerOriginalImage 时将其丢弃。如果您打算上传图像数据,那是错误的键。你想要 UIImagePickerControllerImageURL。那是磁盘上的数据。上传它,不要先弄乱它!

【讨论】:

以上是关于UIImagePickerController() 确实在 UIImage 视图中显示图像很好,但在集合和表的 UIImage 视图中旋转?的主要内容,如果未能解决你的问题,请参考以下文章

UIImagePickerController、自定义 UIButton 和 AutoLayout

UIImagePickerController 实况照片

OCMock 模拟 UIImagePickerController

UIImagePickerController 图像没有改变

无法弹出 UIImagePickerController

为啥 UIImagePickerController 不能推入导航栈?