【问题标题】:Swift PNG Image being saved with incorrect orientation以不正确的方向保存的 Swift PNG 图像
【发布时间】:2017-06-25 04:49:57
【问题描述】:

如果我在保存之前使用图像,这是正常的。但是如果我保存它并稍后使用它是 90 度转动。如何确保它不会横向保存?

func saveEvent(_ center1: CLLocation, title2: String, imagePicked1: UIImage)
    {
        let data = UIImagePNGRepresentation(imagePicked1);///
        let url = NSURL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent(NSUUID().uuidString+".dat")
        do {
            try data!.write(to: url!, options: [])
        } catch let e as NSError {
            print("Error! \(e)");
            return
        }
        let image11 = CKAsset(fileURL: url!)

        self.eventRecord.setObject(image11 as CKAsset, forKey: "Picture")
        let publicData = CKContainer.default().publicCloudDatabase
            publicData.save(self.eventRecord, completionHandler: { record, error in
                if error == nil
                {
                    print("Image saved")
                }else{
                    print(error!)
                }
        })
    }

【问题讨论】:

标签: ios swift uiimage png uiimagepickercontroller


【解决方案1】:

如果您需要以正确的旋转方式保存您的 PNG,如果它的方向不是 .up,您将需要重新绘制您的图像。您可以按如下方式重绘它:

extension UIImage {
    func png(isOpaque: Bool = true) -> Data? { flattened(isOpaque: isOpaque)?.pngData() }
    func flattened(isOpaque: Bool = true) -> UIImage? {
        if imageOrientation == .up { return self }
        UIGraphicsBeginImageContextWithOptions(size, isOpaque, scale)
        defer { UIGraphicsEndImageContext() }
        draw(in: CGRect(origin: .zero, size: size))
        return UIGraphicsGetImageFromCurrentImageContext()
    }
}

编辑/更新:

对于 iOS10+ tvOS10+ 你可以使用UIGraphicsImageRenderer:

extension UIImage {
    func png(isOpaque: Bool = true) -> Data? { flattened(isOpaque: isOpaque).pngData() }
    func flattened(isOpaque: Bool = true) -> UIImage {
        if imageOrientation == .up { return self }
        let format = imageRendererFormat
        format.opaque = isOpaque
        return UIGraphicsImageRenderer(size: size, format: format).image { _ in draw(at: .zero) }
    }
}

游乐场测试:

用于不透明的图像:

let image = UIImage(data: try! Data(contentsOf: URL(string: "https://i.stack.imgur.com/varL9.jpg")!))!

if let data = image.png() {
    let imageFromPNGData = UIImage(data: data)
}

具有透明度:

if let data = image.png(isOpaque: false) {
    let imageFromPNGData = UIImage(data: data)
}

【讨论】:

  • 这是唯一对我有用的答案,我搜索了几天。非常感谢。
  • 这太棒了,但我正在使用 UIImage(data: 将此扁平化数据转换回 UIImage 的工作。此方法似乎拒绝 png 数据。您知道解决方案吗?
  • @GeoffH 这是一个新的图像上下文。您可以将其保存为 JPEG 或 PNG。随意用最小可验证的例子打开一个新问题,如果你愿意,我会看看它
【解决方案2】:

您也可以使用它来防止它改变方向。

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

【讨论】:

    【解决方案3】:

    只需将图像转换为 JPEG 数据即可。无需重新绘制图像:

    let imageData = image.jpegData(compressionQuality: 1.0)

    【讨论】:

      猜你喜欢
      • 2015-05-04
      • 2016-04-16
      • 2019-02-11
      • 1970-01-01
      • 1970-01-01
      • 2021-03-24
      • 1970-01-01
      相关资源
      最近更新 更多