UIImage.pngData(_:) 丢失相机照片方向
UIImage.pngData(_:) losing Camera photo orientation
我正在学习如何使用 UIImagePickerController
,但在使用 UIImagePickerController.sourceType = .camera
时遇到了问题。
我的应用应该做的是:
- 允许用户使用上述系统视图控制器拍照
- 然后使用
UIImage.pngData(_:)
转换此图像
- 将此数据保存到适当的结构字段(在那种情况下,哪个都无关紧要)
- 使用保存到结构中的数据组成一张图片,并将这张图片设置为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()
我正在学习如何使用 UIImagePickerController
,但在使用 UIImagePickerController.sourceType = .camera
时遇到了问题。
我的应用应该做的是:
- 允许用户使用上述系统视图控制器拍照
- 然后使用
UIImage.pngData(_:)
转换此图像
- 将此数据保存到适当的结构字段(在那种情况下,哪个都无关紧要)
- 使用保存到结构中的数据组成一张图片,并将这张图片设置为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()