提问者:小点点

uiimage.pngdata(_:)丢失相机照片方向[重复]


我正在学习如何使用UIIImagePickerController,但在使用UIIImagePickerController.sourceType=.camer时遇到了一个问题。

我的应用程序应该做的是:

  1. 允许用户使用上面提到的系统视图控制器拍摄照片
  2. 然后使用uiimage.pngdata(_:)
  3. 转换此图像
  4. 将此数据保存到适当的结构字段(在这种情况下,哪个字段无关紧要)
  5. 使用保存到结构中的数据组成图像,并将此图像设置为UIButton前景图像

当我这样做的时候(跟随Swift Book的示例项目的应用程序开发),图像似乎因为某种原因被旋转了90度,我想知道这一点。

在将UIImage转换为pngData之前,我已经尝试创建了额外的UImageView并设置了它的image属性,它正常出现了(参见第二个屏幕截图)。

从照片库中选择照片时,在任何情况下(转换前-转换后)都不会出现问题。

所以我想,pngData在某种程度上丢失了照片方位信息? 或者我在别的地方搞砸了。

这里是我的应用程序的截图,所以你可以看到原始照片的样子,以及它在应用程序中的样子(上面是标签-UIButton,下面是测试UImageView)。 别介意文本:)


共1个答案

匿名用户

如果将UIimage保存为JPEG,这将设置旋转标志

PNGS不支持旋转标志,因此如果将UIimage保存为PNG,它将被错误旋转,并且没有设置标志来修复它。 因此,如果您想要pngs,您必须自己旋转它们。

let jpgData = downloadedImage.jpegData(compressionQuality: 1)

要得到旋转图像,你需要绘制。。。 您可以使用以下扩展名

extension UIImage {
    func rotateImage()-> UIImage?  {
        if (self.imageOrientation == UIImage.Orientation.up ) {
            return self
        }
        UIGraphicsBeginImageContext(self.size)
        self.draw(in: CGRect(origin: CGPoint.zero, size: self.size))
       let copy = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return copy
    }
}

如何使用

let rotatedImage =  downloadedImage.rotateImage()