Imagen PNG Swift guardada con orientación incorrecta

Resuelto Steve asked hace 54 años • 3 respuestas

Si uso la imagen antes de guardarla, es normal. Pero si lo guardo y lo uso más tarde, está girado 90 grados. ¿Cómo puedo asegurarme de que no se guarde de lado?

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!)
                }
        })
    }
Steve avatar Jan 01 '70 08:01 Steve
Aceptado

Si necesita guardar su PNG con la rotación correcta, deberá volver a dibujar su imagen si su orientación no es así .up. Puedes volver a dibujarlo de la siguiente manera:

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()
    }
}

editar/actualizar:

Para iOS10+ tvOS10+ puedes usar 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) }
    }
}

Pruebas en el patio de juegos:

Uso para imágenes sin transparencia:

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)
}

Con transparencia:

if let data = image.png(isOpaque: false) {
    let imageFromPNGData = UIImage(data: data)
}
Leo Dabus avatar Feb 07 '2017 19:02 Leo Dabus

También puedes utilizar esto para evitar que cambie de orientación.

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
}
Juan David Torres avatar May 22 '2021 15:05 Juan David Torres

En su lugar, simplemente convierta la imagen a datos JPEG. No es necesario volver a dibujar tu imagen:

let imageData = image.jpegData(compressionQuality: 1.0)

Kirill avatar Feb 17 '2022 23:02 Kirill