【问题标题】:Swift: Images rotated from portrait to landscape when loaded from FirebaseSwift:从 Firebase 加载时从纵向旋转到横向的图像
【发布时间】:2017-02-01 23:41:28
【问题描述】:

我的部分 iOS 应用使用 Firebase 存储来存储和加载用户拍摄/上传的图像。 但是,每次我以纵向将图片上传到 Firebase 时,当我稍后从 Firebase 检索它时,它会以横向显示,因此显示不正确。

我读到 Firebase 存储元数据以确定上传图片的正确方向,但它似乎对我不起作用。

任何人都知道如何获取图像上传的方向,而无需在应用程序代码中手动旋转它?

谢谢!

编辑代码:

上传中:

        let imageMetaData = FIRStorageMetadata()
        imageMetaData.contentType = "image/png"

        var imageData = Data()
        imageData = UIImagePNGRepresentation(chosenImage)!

        let currentUserProfilePictureRef = currentUserStorageRef.child("ProfilePicture")

        currentUserProfilePictureRef.put(imageData, metadata: imageMetaData) { (metaData, error) in
            if error == nil {
                let downloadUrl = metaData?.downloadURL()?.absoluteString
                self.currentUserRef.updateChildValues(["profilePictureUrl": downloadUrl!])
                if (chosenImage.size.width.isLess(than: (chosenImage.size.height))) {
                    self.currentUserRef.updateChildValues(["profilePictureOrientation": "portrait"])
                }
                else {
                    self.currentUserRef.updateChildValues(["profilePictureOrientation": "landscape"])
                }


            } 
        }

检索:

self.currentUserStorageRef.child("ProfilePicture").data(withMaxSize: 20*1024*1024, completion: {(data, error) in
                    var profilePicture = UIImage(data:data!)

                    if(profilePicture?.size.width.isLess(than: (profilePicture?.size.height)!))! {
                        if (pictureOrientation == "landscape") {
                            profilePicture = profilePicture?.rotated(by: Measurement(value: -90.0, unit: .degrees))
                        }
                    } else {
                        if (pictureOrientation == "portrait") {
                            profilePicture = profilePicture?.rotated(by: Measurement(value: 90.0, unit: .degrees))
                        }
                    }

                    self.buttonProfilePicture.setImage(profilePicture, for: .normal)
                    self.buttonProfilePicture.imageView?.contentMode = .scaleAspectFill
                })

【问题讨论】:

  • 您可以添加用于存储和检索图像的代码吗?
  • 在获取保存在 CloudKit 中的图像时,我随机发生了类似的事情。您是否使用PNGRepresentation 保存它们?
  • 是的,使用 PNGRepresentation!这是这里的问题吗?
  • 编辑原始问题以添加代码。我目前正在手动检查图像是纵向还是横向上传,然后在必要时旋转图像,因为这不起作用。
  • 一年前我问过同样的问题stackoverflow.com/q/35973296/5378116

标签: ios swift firebase firebase-storage


【解决方案1】:

根据我自己的个人经验(一年前几乎问过同样的问题),我发现当您使用UIImagePNGRepresentation 保存图像时,它实际上并没有存储该特定图像的方向数据。当您遇到方向问题时,您应该使用UIImageJPEGRepresentationJPEG 使用指定图像方向的exif 格式,而PNG 显然没有。如果您使用UIImageJPEGRepresentation保存图片,您的问题应该会得到解决

【讨论】:

    【解决方案2】:

    Swift 5 - 更新

    这对我有用,只需在上传之前将其应用于您的 UIImage。

    extension UIImage {
    
    func fixedOrientation() -> UIImage? {
        guard imageOrientation != UIImage.Orientation.up else {
            // This is default orientation, don't need to do anything
            return self.copy() as? UIImage
        }
    
        guard let cgImage = self.cgImage else {
            // CGImage is not available
            return nil
        }
    
        guard let colorSpace = cgImage.colorSpace, let ctx = CGContext(data: nil, width: Int(size.width), height: Int(size.height), bitsPerComponent: cgImage.bitsPerComponent, bytesPerRow: 0, space: colorSpace, bitmapInfo: CGImageAlphaInfo.premultipliedLast.rawValue) else {
            return nil // Not able to create CGContext
        }
    
        var transform: CGAffineTransform = CGAffineTransform.identity
    
        switch imageOrientation {
        case .down, .downMirrored:
            transform = transform.translatedBy(x: size.width, y: size.height)
            transform = transform.rotated(by: CGFloat.pi)
        case .left, .leftMirrored:
            transform = transform.translatedBy(x: size.width, y: 0)
            transform = transform.rotated(by: CGFloat.pi / 2.0)
        case .right, .rightMirrored:
            transform = transform.translatedBy(x: 0, y: size.height)
            transform = transform.rotated(by: CGFloat.pi / -2.0)
        case .up, .upMirrored:
            break
        @unknown default:
            break
        }
    
        // Flip image one more time if needed to, this is to prevent flipped image
        switch imageOrientation {
        case .upMirrored, .downMirrored:
            transform = transform.translatedBy(x: size.width, y: 0)
            transform = transform.scaledBy(x: -1, y: 1)
        case .leftMirrored, .rightMirrored:
            transform = transform.translatedBy(x: size.height, y: 0)
            transform = transform.scaledBy(x: -1, y: 1)
        case .up, .down, .left, .right:
            break
        @unknown default:
            break
        }
    
        ctx.concatenate(transform)
    
        switch imageOrientation {
        case .left, .leftMirrored, .right, .rightMirrored:
            ctx.draw(cgImage, in: CGRect(x: 0, y: 0, width: size.height, height: size.width))
        default:
            ctx.draw(cgImage, in: CGRect(x: 0, y: 0, width: size.width, height: size.height))
            break
        }
    
        guard let newCGImage = ctx.makeImage() else { return nil }
        return UIImage.init(cgImage: newCGImage, scale: 1, orientation: .up)
    }
    

    }

    【讨论】:

      【解决方案3】:

      只是一个更新,最近版本的 xcode 中 UIImageJPEGRepresentation 已更改为 jpegData。

      jpegData(compressionQuality: 1.0) 1.0 表示高质量,0 表示低质量。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-10-25
        • 1970-01-01
        • 2023-03-05
        • 1970-01-01
        • 1970-01-01
        • 2017-07-19
        • 2011-03-06
        • 2011-07-23
        相关资源
        最近更新 更多