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