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

WebP encodedData loads for 30+ seconds

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. 尽量使用压缩质量之类的选项,成本较高 更多时间,但压缩 more.By 默认为 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