上传到Firebase存储后图像大小已更改

时间:2018-09-16 07:43:53

标签: ios swift firebase firebase-storage

imageToUpload在这里是375x500。上传到Firebase存储后,宽度和高度增加了一倍。上传到Firebase存储后是否可以保持大小不变​​?

if let uploadData = UIImageJPEGRepresentation(imageToUpload, 0.0) {
            uploadImageRef.putData(uploadData, metadata: nil) { (metadata, error) in
                if error != nil {
                    print("error")
                    completion?(false)
                } else {
                    // your uploaded photo url.
                    // Metadata contains file metadata such as size, content-type.
                    let size = metadata?.size
                    // You can also access to download URL after upload.
                    uploadImageRef.downloadURL { (url, error) in
                        guard let downloadURL = url else {
                            // Uh-oh, an error occurred!
                            completion?(false)
                            return
                        }
                        print("Download url : \(downloadURL)")
                        completion?(true)
                    }
                }
            }
        }

请注意,我正在使用以下扩展程序在上传之前将图像尺寸更改为375x500(imageToUpload的尺寸)。

extension UIImage {
    func resized(to size: CGSize) -> UIImage {
        return UIGraphicsImageRenderer(size: size).image { _ in
            draw(in: CGRect(origin: .zero, size: size))
        }
    }
}

let imageToUploadResize:UIImage = image.resized(to: CGSize(width: 375.0, height: 500.0))

2 个答案:

答案 0 :(得分:1)

正如我在IMO中的评论中所提到的,扩展中的功能确实像独立功能一样被调用,而没有真正扩展功能。我建议将其设置为调整传入图像大小并返回新图像的功能。

使用此功能,您的图片将被调整为正确的尺寸,并以该尺寸上传(验证它可以正常工作)

func resizeImage(image: UIImage, targetSize: CGSize) -> UIImage {
    let rect = CGRect(x: 0, y: 0, width: targetSize.width, height: targetSize.height)
    UIGraphicsBeginImageContextWithOptions(targetSize, false, 1.0)
    image.draw(in: rect)
    let newImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    return newImage!
}

然后这样称呼

let updatedSize = CGSize(width: 300.0, height: 400.0)
let resizedImage = self.resizeImage(image: origImage!, targetSize: updatedSize)

现在要解决10k英尺高的扩展名问题。

所有内容都可以追溯到在iDevice上呈现的方式。回到iPhone 2g,3g时,渲染时使用的是1-1,因此,如果您在模拟器中的该设备上运行代码并将图像大小设置为320x480,则它将是存储在firebase中的320x480图像。但是,随着屏幕的改进和分辨率的提高,渲染也随之提高,这会影响UIImage。

因此,如果您将项目设置为在iPhone 6上模拟,则同一图像将为640x960(2x),然后到iPhone 8+,其大小为960 x 1440(3x)。 (涉及到上采样,因此我们在这里忽略了它。)

UIImage知道它在使用什么设备,因此应予以考虑。

同样,从广义上讲,这涉及很多其他组件,尤其是pixels = logicalPoints * scaleFactor

答案 1 :(得分:0)

尝试使用以下resource提供的调整大小的图像代码。您的扩展程序将创建图像的新实例并返回它,而不是更新实际的图像本身。

如果您想继续使用扩展程序,建议您尝试

extension UIImage {
    func resized(to size: CGSize) {
        self = UIGraphicsImageRenderer(size: size).image { _ in
            draw(in: CGRect(origin: .zero, size: size))
        }
    }
}