在WebView中使用webp格式图片

本文介绍了一种在WebView中加载webp格式图片的方法。由于WebView本身不支持webp,作者通过解析HTML内容,转换图片链接,下载并缓存webp图片为jpg或png,再通过JavaScript刷新页面来显示图片。文章详细阐述了处理过程,包括HTML内容解析、图片下载和本地替换等步骤,适用于需要在WebView中使用webp图片的开发者。
摘要由CSDN通过智能技术生成

    很早之前,我们的项目中就已经采用了webp格式,但是由于webView本身并不能解析webp格式,所以我们基于webView的文章详情页就无法使用到这项优化。
    那么有没有什么办法能实现呢?当然是有的。

    在开始技术讲解之前需要先说明,本文的技术方案,是基于本项目的情况:文章的正文大部分通过接口直接获取到,通过在客户端本地进行html正文组装,最后通过webView的loadHTMLString方法进行加载显示。普通的图片可以通过转换链接得到webp服务器获取到相应的webp版的图片。

    本项目中,图片缓存使用了SDWebImage,并且开启了webp支持功能,那么我们对详情页webView的处理也会基于此来实现。
    通过思考,方案其实还是比较明确的,就是替换html中图片链接,通过客户端下载webp图片,然后在通过js刷新出页面上的下完的图片,但实际开发中也遇到了一些坑,比如:

  • HTML解析库的setAttributeNamed不能增加属性
  • webp服务器图片下载后的默认缓存时gif不能正常存储
  • 下载完的图片不能实时通过js更改src为本地文件地址加载出来

最终的技术实现:
1.对下载回来的html内容进行处理,获取所有图片链接,并进行webp链接处理转换
    对html内容的解析处理我使用的是Objective-C-HMTL-Parser,但是该库已经多年不维护,这里有我fork后进行部分优化调整的版本:https://github.com/YueRuo/Objective-C-HMTL-Parser
    处理html图片核心处理逻辑代码:

@try {
    HTMLParser *parser = [[HTMLParser alloc] initWithString:htmlContent error:&error];
    HTMLNode *bodyNode = [parser body];
    if (error) {
        return;
    }
    //得到所有的img标签
    NSArray *inputNodes = [bodyNode findChildTags:@"img"];

    for (HTMLNode *inputNode in inputNodes) {
        NSString *imageSrc = [inputNode getAttributeNamed:@"src"];
        if (!imageSrc) {
            continue;
        }
        NSString *newSrc = [[GlobalVariable shareInstance] resizeWebpImageWithUrl:imageSrc size:CGSizeMake((SCREEN_WIDTH - 20) * 2, 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值