通过amazon SDK在s3的多个线程上上传图像需要花费大量时间。让我知道您是否遇到相同的问题并找到任何解决方案。
weiqingtao 回答:通过iOS Amazon SDK在S3上缓慢上传图像
没有您的代码,很难回答这个问题。但是正如您所说的,上载需要很多时间,我认为您的问题在于图像的大小。从iPhone中选取图像时,图像质量很高。其高分辨率和文件大小是上传速度缓慢的原因。因此,在上传到AWS存储桶之前,请根据需要压缩图像并降低分辨率。
当您选择图像时,
func imagePickerController(_ picker: UIImagePickerController,didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
let fileManager = FileManager.default
let documentsPath = fileManager.urls(for: .documentDirectory,in: .userDomainMask).first
let imagePath = documentsPath?.appendingPathComponent("image.jpg")
// extract image from the picker and save it
if let pickedImage = self.scale(image: (info[UIImagePickerController.InfoKey.originalImage] as? UIImage)!,toLessThan: 320) {
let imageData = pickedImage.jpegData(compressionQuality: 0.5)
try! imageData!.write(to: imagePath!)
DispatchQueue.main.async {
self.imgProfileImageView.image = pickedImage
}
}
picker.dismiss(animated: true) {
}
}
您可以使用此功能降低分辨率
private func scale(image originalImage: UIImage,toLessThan maxResolution: CGFloat) -> UIImage? {
guard let imageReference = originalImage.cgImage else { return nil }
let rotate90 = CGFloat.pi/2.0 // Radians
let rotate180 = CGFloat.pi // Radians
let rotate270 = 3.0*CGFloat.pi/2.0 // Radians
let originalWidth = CGFloat(imageReference.width)
let originalHeight = CGFloat(imageReference.height)
let originalOrientation = originalImage.imageOrientation
var newWidth = originalWidth
var newHeight = originalHeight
if originalWidth > maxResolution || originalHeight > maxResolution {
let aspectRatio: CGFloat = originalWidth / originalHeight
newWidth = aspectRatio > 1 ? maxResolution : maxResolution * aspectRatio
newHeight = aspectRatio > 1 ? maxResolution / aspectRatio : maxResolution
}
let scaleRatio: CGFloat = newWidth / originalWidth
var scale: CGAffineTransform = .init(scaleX: scaleRatio,y: -scaleRatio)
scale = scale.translatedBy(x: 0.0,y: -originalHeight)
var rotateAndMirror: CGAffineTransform
switch originalOrientation {
case .up:
rotateAndMirror = .identity
case .upMirrored:
rotateAndMirror = .init(translationX: originalWidth,y: 0.0)
rotateAndMirror = rotateAndMirror.scaledBy(x: -1.0,y: 1.0)
case .down:
rotateAndMirror = .init(translationX: originalWidth,y: originalHeight)
rotateAndMirror = rotateAndMirror.rotated(by: rotate180 )
case .downMirrored:
rotateAndMirror = .init(translationX: 0.0,y: originalHeight)
rotateAndMirror = rotateAndMirror.scaledBy(x: 1.0,y: -1.0)
case .left:
(newWidth,newHeight) = (newHeight,newWidth)
rotateAndMirror = .init(translationX: 0.0,y: originalWidth)
rotateAndMirror = rotateAndMirror.rotated(by: rotate270)
scale = .init(scaleX: -scaleRatio,y: scaleRatio)
scale = scale.translatedBy(x: -originalHeight,y: 0.0)
case .leftMirrored:
(newWidth,newWidth)
rotateAndMirror = .init(translationX: originalHeight,y: originalWidth)
rotateAndMirror = rotateAndMirror.scaledBy(x: -1.0,y: 1.0)
rotateAndMirror = rotateAndMirror.rotated(by: rotate270)
case .right:
(newWidth,y: 0.0)
rotateAndMirror = rotateAndMirror.rotated(by: rotate90)
scale = .init(scaleX: -scaleRatio,y: 0.0)
case .rightMirrored:
(newWidth,newWidth)
rotateAndMirror = .init(scaleX: -1.0,y: 1.0)
rotateAndMirror = rotateAndMirror.rotated(by: CGFloat.pi/2.0)
}
UIGraphicsBeginImageContext(CGSize(width: newWidth,height: newHeight))
guard let context = UIGraphicsGetCurrentContext() else { return nil }
context.concatenate(scale)
context.concatenate(rotateAndMirror)
context.draw(imageReference,in: CGRect(x: 0,y: 0,width: originalWidth,height: originalHeight))
let copy = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return copy
}