惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

D
Docker
Apple Machine Learning Research
Apple Machine Learning Research
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 三生石上(FineUI控件)
月光博客
月光博客
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
WordPress大学
WordPress大学
Hugging Face - Blog
Hugging Face - Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
M
MIT News - Artificial intelligence
腾讯CDC
B
Blog RSS Feed
H
Help Net Security
J
Java Code Geeks
有赞技术团队
有赞技术团队
Y
Y Combinator Blog
博客园_首页
Last Week in AI
Last Week in AI
博客园 - 【当耐特】
博客园 - Franky
B
Blog
MongoDB | Blog
MongoDB | Blog
博客园 - 叶小钗
Martin Fowler
Martin Fowler

isaced

使用 TypeScript 构建的 appstore-connect-sdk 归档 我用 SwiftUI 写了一个 V2ex 客户端 Docker 容器化多应用部署 Swift Server-side [译] 探索 Swift 4 中新的 String API 对一个 Django 站点做 ab 压力测试 fir-mac 开发笔记 iOS10 Safari 引导用户信任企业签名 Swift Web 开发之 Vapor - 模版 Leaf(三) Swift Web 开发之 Vapor - 路由(二) HoloLens 初体验 Swift Web 开发之 Vapor - 入门(一) Jenkins for iOS 搭建日记 iOS HOOK 注入与重签名 Xcode 使用 Configuration 来配置不同的项目环境 图床从SAE迁移到七牛 给 UIProgressView 脱掉那层微弱的渐变 初用 CocoaAsyncSocket 记一次 SQLite 性能优化 有多色 - 开发小记 海岛风情 - 泰国普吉岛六日游 EGOCache 源码解析 日语五十音假名临摹校验算法 [iOS] UITextView 追加文字自动跳到顶部解决方法 Cocoa 新的依赖管理工具:Carthage 新年快乐! 博客主机换到搬瓦工 写了个iOS小游戏:有多色 iOS 后台任务之 Long-running background task
SDWebImage 为什么无法读取 webpmux 生成的 WebP 动图?
2017-06-29 · via isaced

Featured image of post SDWebImage 为什么无法读取 webpmux 生成的 WebP 动图?

前几天有个需求是需要把一些 JPG 图片转换成 WebP 然后放到客户端里播放动图,主要是想享受 WebP 格式带来的压缩率,生成更小的图片文件,节省带宽和下载时间。

webpmux 是什么?

webpmux 是 Google 为其 WebP 出得附属配套工具,专门用来操作 WebP 动图,可以从 WebP 动图里抽出每一帧,也可以从一批图像帧合成成一张 WebP 动图,同时也支持设定循环次数、背景颜色,每一帧的播放时长、暂停时间等等。

为什么解不开?

由于 webpmux 的 file_i +di[+xi+yi[+mi[bi]]] 参数 BLEND 项默认为 +b (BLEND) 所以导致我们生成的 WebP 动图用 SDWebImage 解析不出来。

因为 SDWebImage/UIImage+WebP.m 中判断如果当前帧 为 WEBP_MUX_BLEND 则用 sd_blendWebpImageWithOriginImage 解,否则用 sd_rawWepImageWithData 方法

    ...
    do {
        UIImage *image;
        if (iter.blend_method == WEBP_MUX_BLEND) {
            image = [self sd_blendWebpImageWithOriginImage:[images lastObject] iterator:iter];
        } else {
            image = [self sd_rawWepImageWithData:iter.fragment];
        }

        if (!image) {
            continue;
        }

        [images addObject:image];
        duration += iter.duration / 1000.0f;

    } while (WebPDemuxNextFrame(&iter));
    ...

sd_blendWebpImageWithOriginImage 又需要取到上一帧做 blend 叠加,由于第一帧被指定成了 BLEND,所以导致后面所有帧都解不出来。

+ (nullable UIImage *)sd_blendWebpImageWithOriginImage:(nullable UIImage *)originImage iterator:(WebPIterator)iter {
    if (!originImage) {
        return nil;
    }
    ...
}

解决办法

解决办法就是显示指定 webpmux 的 BLEND 参数为 -b (NO_BLEND),让第一帧不使用混合模式,SDWebImage 就能正确解析了。

webpmux -frame 0.webp +100+0+0+0-b \
  -frame 1.webp +100+0+0+0-b \
  -frame 2.webp +100+0+0+0-b \
  -frame 3.webp +100+0+0+0-b \
  -o anim.webp

另外 YYWebImage 的 WebP 解码方式好像是有些不太一样,没有细看,所以用 YY 应该是没问题的。