UIImage.pngData(_:) 丢失相机照片方向

UIImage.pngData(_:) losing Camera photo orientation

我正在学习如何使用 UIImagePickerController,但在使用 UIImagePickerController.sourceType = .camera 时遇到了问题。

我的应用应该做的是:

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

当我这样做时(在使用 Swift 本书的示例项目进行应用程序开发之后)图像似乎 旋转 90 度 出于某种原因,我会想知道。

我尝试创建额外的 UIImageView 并设置它的图像 属性 将 UIImage 转换为 pngData 之前,它正常显示(见第二张截图)。

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

所以我想,pngData 以某种方式丢失了照片方向信息?或者我在别的地方搞砸了,也许。

这是我的应用程序的屏幕截图,因此您可以看到原始照片的外观以及它在应用程序中的外观(标签上方 - UIButton,下方 - 测试 UIImageView)。没关系的文字:)

如果将 UIImage 保存为 JPEG,这将设置旋转 flag

PNGs 不支持旋转 flag,所以如果你将 UIImage 保存为 PNG,它会被错误地旋转并且没有 flag 设置修复它。所以如果你想要 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()