iOS 上的 WebP 图像格式

发布于 2024-12-23 12:16:03 字数 647 浏览 2 评论 0原文

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

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

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

Q1. iOS 中是否可以开发一个图像解码器,以便本机 imageWithData 和其他 API 能够读取新格式?

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

我可以继承 UIImage,重写一些方法(例如 +imageWithContentsOfFile、+imageWithData、+imageNamed、-drawInRect、-drawAtPoint),并使我的 WPImage 对象与 SDK 提供的 API 配合良好吗?

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

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

I’m currently researching the possibility to use Google’s WebP image format in our iOS software.

I found it’s not hard to decode the WebP into RGBA8888 as needed using the Google’s C-library.

However, I’d like to create an implementation comparable to UIImage in terms of both API and performance.

Q1. Is it possible in iOS to develop an image decoder so that native imageWithData and other APIs will read the new format?

Q2. If no, what API does UIImageView (and other framework-provided controls) use to draw the UIImage? Is it public (e.g. drawInRect/drawAtPoint) or internal?

Can I inherit from UIImage, override a few methods (such as +imageWithContentsOfFile, +imageWithData, +imageNamed, -drawInRect, -drawAtPoint), and have my WPImage objects behave well with SDK-provided APIs?

Q3. If every instance of my hypothetical WPImage class will subscribe for UIApplicationDidReceiveMemoryWarningNotification (to flush RGBA image buffer leaving the much smaller original WebP data in RAM), won’t it hurt the performance much?

The software we’re developing may easily have hundreds of different images in RAM.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

吝吻 2024-12-30 12:16:03

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

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

I made full (decode/encode) UIImage wrapper for WebP.

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

九歌凝 2024-12-30 12:16:03

WebP 图像支持 iOS 14 即将

更新您的设备。

WebP Image Support Coming to iOS 14

update your devices.

橪书 2024-12-30 12:16:03

我编写的另一个例子使用了 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

Another example I've written uses the work that Carson McDonald started but in a reusable fashion. Basically you add the WebP.framework to your project (included in my example or create-able using the instructions Carson has on his website) and then you can do something like this:

#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]];

If you want to take a look at my example, go here: https://github.com/nyteshade/iOSWebPWithAlphaExample

绝不放开 2024-12-30 12:16:03

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

First, decode the WebP pixels into a buffer. You then need to call CGDataProviderCreateWithData() to create a "data provider" for CoreGraphics and then call CGImageCreate() and pass in the provider and all the needed arguments. Finally, invoke UIImage imageWithCGImage:imageRef in order to create a UIImage instance.

海夕 2024-12-30 12:16:03

SDWebImage 是一个提供异步图像下载器的库,可以通过 SDWebImageWebPCoder

SDWebImage is a library which provides an async image downloader which can easily be extended to support WebP via SDWebImageWebPCoder.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文