UIImage.pngData(_:)丢失相机照片的方向[重复]。

问题描述 投票:1回答:1

我正在学习如何使用 UIImagePickerController 并陷入了一个问题,使用 UIImagePickerController.sourceType = .camera.

我的应用应该做的是。

  1. 以允许用户使用上述系统视图控制器进行拍照
  2. 然后用 UIImage.pngData(_:)
  3. 将这些数据保存到一个合适的结构域中(在这种情况下,哪一个结构域并不重要)
  4. 使用保存在结构中的数据组成一个图像,并将该图像设置为UIButton前景图像。

当我这样做的时候(按照Swift书中的示例项目进行App开发),图像出现的是 旋转90度 出于某种原因,我想知道。

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

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

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

下面是我的应用的截图,你可以看到原始拍摄的照片的样子,以及它在应用中的样子(上面的标签--UIButton,下面--测试UIImageView)。无关文字:)

How user sees taken photoHow it looks in-app

ios swift xcode uiimage
1个回答
1
投票

如果你保存 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()
© www.soinside.com 2019 - 2024. All rights reserved.