【问题标题】:WebP image format on iOSiOS 上的 WebP 图像格式
【发布时间】:2012-01-30 03:20:12
【问题描述】:

我目前正在研究在我们的 iOS 软件中使用 Google 的 WebP 图像格式的可能性。

我发现使用 Google 的 C 库根据需要将 WebP 解码为 RGBA8888 并不难。

但是,我想创建一个在 API 和性能方面与 UIImage 相当的实现。

第一季度。是否可以在 iOS 中开发图像解码器,以便原生 imageWithData 和其他 API 读取新格式?

第二季度。如果不是,UIImageView(和其他框架提供的控件)使用什么 API 来绘制 UIImage?它是公开的(例如 drawInRect/drawAtPoint)还是内部的?

我是否可以从 UIImage 继承、覆盖一些方法(例如 +imageWithContentsOfFile、+imageWithData、+imageNamed、-drawInRect、-drawAtPoint),并让我的 WPImage 对象在 SDK 提供的 API 中表现良好?

第三季度。如果我假设的 WPImage 类的每个实例都订阅 UIApplicationDidReceiveMemoryWarningNotification(以刷新 RGBA 图像缓冲区,将更小的原始 WebP 数据留在 RAM 中),这不会对性能造成太大影响吗?

我们正在开发的软件可能很容易在 RAM 中有数百个不同的图像。

【问题讨论】:

    标签: iphone ios uiimage image-formats webp


    【解决方案1】:

    我为WebP 制作了完整的(解码/编码)UIImage 包装器。

    https://github.com/shmidt/WebP-UIImage

    【讨论】:

    • 我已经尝试实现这一点以从 UIImage 获取 WebP,但它只是挂在运行 iOS 7 的 iPhone 4S 上:CPU 超过 90% 就坐在那里。我链接到具有相同结果的重建 WebP 库。它在调用 WebPEncodeRGBA 期间挂起。您是否能够从 UIImage 成功编码 WebP?
    • @pickwick 我没有在设备上尝试过,但是您可以尝试更新框架的版本:github.com/seanooi/iOS-WebP
    • 我更新了框架。问题原来是我的耐心:编码大图像太慢且处理器密集型。如果我将图像大小调整为 1200 x 1200,我可以在大约 10 秒后获取数据。文件大小小于 JPEG,但处理时间太长,无法在我的应用程序中使用。谢谢
    • 在6S上编码一张4K图片需要18秒。大部分时间都花在了 google 的 WebPEncodeRGBA
    • 一种方法是检查您是否可以放弃 google 框架,看看您是否可以使用 gpu 进行编码。但这显然不是一个单一的努力;-)
    【解决方案2】:

    【讨论】:

    • 您是否阅读了这个问题,尤其是“使用 google 的 C 库根据需要将 WebP 解码为 RGBA8888 并不难”?当然,解码是微不足道的。我的问题是关于 WebP 解码器与 UIKit 的集成,而不是解码本身。
    【解决方案3】:

    iOS 14 支持 WebP 图像

    更新您的设备。

    【讨论】:

    • 终于!比 Android 晚 2 年
    【解决方案4】:

    我编写的另一个示例使用了 Carson McDonald 开始的工作,但采用了可重复使用的方式。基本上,您将 WebP.framework 添加到您的项目中(包括在我的示例中或使用 Carson 在他的网站上的说明创建),然后您可以执行以下操作:

    #import "UIImage+WebP.h"
    ...
    
    self.imageView.image = [UIImage imageFromWebP:@"path/to/image.webp"];
    // or
    [self.button setImage:[UIImage imageFromWebP:@"path/to/image.webp" 
            forState:UIControlStateNormal]];
    

    如果你想看看我的例子,去这里:https://github.com/nyteshade/iOSWebPWithAlphaExample

    【讨论】:

    • 如果 webp 是本地的呢?
    【解决方案5】:

    首先,将 WebP 像素解码到缓冲区中。然后,您需要调用 CGDataProviderCreateWithData() 为 CoreGraphics 创建一个“数据提供者”,然后调用 CGImageCreate() 并传入提供者和所有需要的参数。最后,调用 UIImage imageWithCGImage:imageRef 以创建 UIImage 实例。

    【讨论】:

      【解决方案6】:

      SDWebImage 是一个提供异步图像下载器的库,可以通过SDWebImageWebPCoder 轻松扩展以支持 WebP。

      【讨论】:

        猜你喜欢
        • 2019-09-20
        • 2018-06-02
        • 2022-08-20
        • 1970-01-01
        • 2021-09-03
        • 2014-09-30
        • 2015-09-16
        • 2021-09-05
        • 1970-01-01
        相关资源
        最近更新 更多