iOS 上的 WebP 图像格式
我目前正在研究在我们的 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
我为
WebP
制作了完整(解码/编码)UIImage
包装器。https://github.com/shmidt/WebP-UIImage
I made full (decode/encode)
UIImage
wrapper forWebP
.https://github.com/shmidt/WebP-UIImage
WebP 图像支持 iOS 14 即将
更新您的设备。
WebP Image Support Coming to iOS 14
update your devices.
有一个例子。 https://github.com/carsonmcdonald/WebP-iOS-example
There is an example . https://github.com/carsonmcdonald/WebP-iOS-example
我编写的另一个例子使用了 Carson McDonald 开始的工作,但以可重用的方式。基本上,您将 WebP.framework 添加到您的项目中(包含在我的示例中,或者使用 Carson 在他的网站上的说明进行创建),然后您可以执行以下操作:
如果您想查看我的示例,请转到此处: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:
If you want to take a look at my example, go here: https://github.com/nyteshade/iOSWebPWithAlphaExample
首先,将 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.
SDWebImage 是一个提供异步图像下载器的库,可以通过 SDWebImageWebPCoder。
SDWebImage is a library which provides an async image downloader which can easily be extended to support WebP via SDWebImageWebPCoder.