ios - 通过 iOS amazon sdk 在 s3 上上传图片缓慢

标签 ios swift amazon-s3 grand-central-dispatch

通过 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, newHeight) = (newHeight, newWidth)
        rotateAndMirror = .init(translationX: originalHeight, y: originalWidth)
        rotateAndMirror = rotateAndMirror.scaledBy(x: -1.0, y: 1.0)
        rotateAndMirror = rotateAndMirror.rotated(by: rotate270)

    case .right:
        (newWidth, newHeight) = (newHeight, newWidth)
        rotateAndMirror = .init(translationX: originalHeight, y: 0.0)
        rotateAndMirror = rotateAndMirror.rotated(by: rotate90)
        scale = .init(scaleX: -scaleRatio, y: scaleRatio)
        scale = scale.translatedBy(x: -originalHeight, y: 0.0)

    case .rightMirrored:
        (newWidth, newHeight) = (newHeight, 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
}

关于ios - 通过 iOS amazon sdk 在 s3 上上传图片缓慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58928322/

相关文章:

ios - 即使更新了表格 View 单元格,如何在表格 View 中保留表格 View 单元格的编辑模式?

ios - 如何使用委托(delegate)从一个 Controller 向另一个 Controller 发送消息?

iphone - 主线程中的 MBProgressHUD 问题。

ios - 计算核心数据实体的属性

ios - 如何在 NSAttributedString 中创建可点击链接

java - 使用 AWS Java SDK 将文档从 Amazon s3 上传到 CloudSearch

ios - 将 UITableView 平移限制为 1 个手指

ios - 在 mmdrawercontroller 中快速隐藏导航栏

javascript - 在对象属性中使用破折号字符

django - '可疑操作: Attempted access to "" denied' while loading static files