ios - Swift PNG 图像以不正确的方向保存

标签 ios swift uiimage png uiimagepickercontroller

如果我在保存之前使用图像,这是正常的。但如果我保存它并稍后使用它,它就会旋转 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!)
                }
        })
    }

最佳答案

如果您需要保存正确旋转的 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) }
    }
}

Playground 测试:

无透明度图像的用法:

let image = UIImage(data: try! Data(contentsOf: URL(string: "/image/varL9.jpg")!))!

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

透明:

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

关于ios - Swift PNG 图像以不正确的方向保存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42098390/

相关文章:

IOS 使用 SDWebImage 从 URL 加载图像

iphone - 为什么我的窗口 subview 显示,但不处理任何触摸?

iphone - 使用正则表达式在 Xcode 中查找/替换

iphone - 从原始 RGBA 数据创建 UIImage

generics - swift 中的一般问题

ios - 应用过滤器时出现 NSInvalidArgumentException

iphone - UITableViewCell 右边有图片?

objective-c - 移除 applicationDidEnterBackground 中的 uialertview

ios - XCode 8.2.1 自动布局 : Issues with busy, 填充 UIViewControllers

regex - swift 正则表达式