ios - WebP 编码的数据加载时间超过 30 秒

标签 ios swift image webp

iOS 版本:13.1 iPhone:X

我目前正在使用 DBAttachmentPickerController 从各种图像中进行选择,当我直接从相机拍摄照片并尝试将其上传到我们的服务器时,问题就来了。 SDImageWebPCoder.shared.encodedData 加载时间减少了大约 30 秒。 Android 应用程序中的相同图像大约需要 2-3 秒。

这是我使用的代码

let attachmentPickerController = DBAttachmentPickerController(finishPicking: { attachmentArray in
            self.images = attachmentArray
            var currrentImage = UIImage()
            self.images[0].loadOriginalImage(completion: { image in
                self.userImage.image = image
                currrentImage = image!
            })
            //We transform it to webP 
            let webpData = SDImageWebPCoder.shared.encodedData(with: currrentImage, format: .webP, options: nil)
            self.api.editImageUser(data: webpData!)
        }, cancel: nil)
        attachmentPickerController.mediaType = DBAttachmentMediaType.image
        attachmentPickerController.allowsSelectionFromOtherApps = true
        attachmentPickerController.present(on: self)

我应该更换正在使用的 Pod 吗?我应该压缩它吗?还是我做错了什么?

最佳答案

WebP编码速度相对较慢,它使用软件编码和VP8压缩算法(复杂),相对于硬件加速的JPEG/PNG编码。 (Apple 的 SoC)。

picture directly from the camera

用 iPhone 相机拍摄的原始图像可能真的很漂亮,像 4K 分辨率。如果您不做一些预缩放并尝试对其进行编码,您可能会消耗更多时间。

建议可以这样:

  1. 尽量使用compressionQuality之类的选项,成本较高 更多时间,但压缩更多。默认为 1.0,这是最高和最耗时的。
  2. 尝试对原始图像进行预缩放。对于来自 Photos Libraray 的图像,您始终可以使用 API 来控制大小。或者,您可以使用 SDWebImage 的转换方法,如 - [UIImage sd_resizedImage:]
  3. 在后台线程中完成所有编码,从不阻塞主线程
  4. 如果所有这些都不合适,更好的解决方案是使用 JPEG 和 PNG 格式而不是 WebP。然后,在您的图像服务器端代码上,将 JPEG/PNG 转码为 WebP。服务器端处理始终是这件事的最佳主意。

如果您对与 JPEG/PNG(硬件)和 WebP(软件)相比的真正基准或其他东西感兴趣。您可以在这里尝试使用我的基准代码演示,以帮助您做出决定。

https://github.com/dreampiggy/ModernImageFormatBenchmark

关于ios - WebP 编码的数据加载时间超过 30 秒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58547170/

相关文章:

ios - 按下 UINavigationController 的后退栏按钮时执行操作

ios - 什么是 Xcode 中的主线程检查器

ios - 快速更改所选标签栏图标的颜色

Java图像显示

html - 根据 angularjs 表达式更改 img 源

ios - 如何判断 CBCentralManager 是否仍在处理 scanForPeripheralsWithServices?

ios - Swift:在每个单元格中添加一个 UIButton,同时在代码中有一个 UITableViewCell 但在 Storyboard中没有

Android LayoutInflation 的 iOS/Swift 等价物

ios - 嵌套 Alamofire 请求

ios - API图像文件上传iPhone到Ruby on Rails