一分钟让您的APP支持AVIF图片

news/2024/4/27 5:00:20/文章来源:https://blog.csdn.net/Tencent_COS/article/details/129751732

| 导语AVIF是一种基于AV1视频编码的新一代图像格式,压缩率高,画面细节好。移动端APP经常面临网络环境不稳定、需要帮用户节省流量等场景,那就使用AVIF图片吧。不过AVIF目前只在 iOS16、Android12 上得到原生支持,很多机型覆盖不到,怎么办?本文来教你一分钟集成AVIF解码器,兼容所有机型。

AVIF简介

AVIF是一种基于AV1视频编码的新图像格式,相对于JPEG,WEBP这类图片格式来说,它的压缩率更高,并且画面细节更好。而最关键的是,AV1 由谷歌发起的AOM(开放媒体联盟)推动,在 VP9 的基础上继续演进,无专利授权费用(而且腾讯也是AOM的创始成员哦),关于更多的AVIF介绍,可以自行搜索,这里不再赘述。

APP显示AVIF图片

由于AVIF目前只在 iOS16、Android12 上得到原生支持,要想覆盖所有主流机型,单靠原生支持肯定是不够的。因此需要客户端开发时集成AVIF解码器自行解码,

业内开源编解码库: https://github.com/AOMediaCodec/libavif

腾讯自研编解码库:本文的数据万象AVIF SDK基于该编解码库

直接使用上述解码库,需要自行编译Android和iOS解码器产物,以及写一些JNI代码,如果您的APP使用Glide、SDWebImage等图片库,还得再按照图片库的要求进行封装集成。这些有不少的工作量,本文叫”一分钟让APP支持AVIF图片“显然是有更快的方法,那就是接入数据万象AVIF SDK,上述这些事情我们已经帮您做好啦。

数据万象AVIF图片SDK

一、Android一分钟集成

使用Glide图片库

1. 安装 Glide 和 AVIF SDK

implementation 'com.qcloud.cos:avif:1.1.0'   implementation 'com.github.bumptech.glide:glide:version'annotationProcessor 'com.github.bumptech.glide:compiler:version' 

2. 注册解码器 GlideModule

// 注册自定义 GlideModule // 开发者应该创建此类注册相关解码器<br> // 类库开发者可以继承 LibraryGlideModule 创建类似的注册类@GlideModulepublic class MyAppGlideModule extends AppGlideModule {    @Override    public void registerComponents(@NonNull Context context, @NonNull Glide glide, Registry registry) {        /*------------------解码器 开始-------------------------*/        //注册 AVIF 静态图片解码器        registry.prepend(Registry.BUCKET_BITMAP, InputStream.class, Bitmap.class, new StreamAvifDecoder(glide.getBitmapPool(), glide.getArrayPool()));        registry.prepend(Registry.BUCKET_BITMAP, ByteBuffer.class, Bitmap.class, new ByteBufferAvifDecoder(glide.getBitmapPool()));        //注册 AVIF 动图解码器        registry.prepend(InputStream.class, AvifSequenceDrawable.class, new StreamAvifSequenceDecoder(glide.getBitmapPool(), glide.getArrayPool()));        registry.prepend(ByteBuffer.class, AvifSequenceDrawable.class, new ByteBufferAvifSequenceDecoder(glide.getBitmapPool()));        /*------------------解码器 结束-------------------------*/    }}

3. 使用 Glide 加载图片

像普通jpg png图片那样加载图片即可,请参见 Glide 官方文档

Glide.with(context).load(url).into(imageView);

使用Fresco图片库

1. 安装 Fresco 和 AVIF SDK

implementation 'com.qcloud.cos:avif:1.1.0'   implementation 'com.facebook.fresco:fresco:version'// 如果需要支持 avif 动图解码器 则需要加上 fresco:animated-base 依赖implementation 'com.facebook.fresco:animated-base:version'

2. 配置解码器

// 解码器配置ImageDecoderConfig imageDecoderConfig = new ImageDecoderConfig.Builder()         // 配置 AVIF 静态解码器        .addDecodingCapability(                AvifFormatChecker.AVIF,                new AvifFormatChecker(),                new FrescoAvifDecoder())        // 配置 AVIF 动图解码器        .addDecodingCapability(                AvisFormatChecker.AVIS,                new AvisFormatChecker(),                new FrescoAvisDecoder())        .build();// 配置 Image PipelineImagePipelineConfig config = ImagePipelineConfig.newBuilder(context)        .setImageDecoderConfig(imageDecoderConfig)        .build();// 初始化 FrescoFresco.initialize(context, config);

3. 使用 Fresco 加载图片

像普通jpg png图片那样加载图片即可,请参见 Fresco 官方文档。

<com.facebook.drawee.view.SimpleDraweeView    android:id="@+id/my_image_view"    android:layout_width="130dp"    android:layout_height="130dp"    fresco:placeholderImage="@drawable/my_drawable"  />Uri uri = Uri.parse("https://xxx.com/test.avif");SimpleDraweeView draweeView = (SimpleDraweeView) findViewById(R.id.my_image_view);draweeView.setImageURI(uri);

二、iOS一分钟集成

1. 安装SDWebImage 和 AVIF SDK

在您工程 Podfile 文件中添加模块:

pod 'CloudInfinite/SDWebImage-CloudInfinite'pod 'CloudInfinite/AVIF'

在终端执行安装命令:

pod install

2. 使用 SDWebImage 直接加载 AVIF 图片

SDWebImage-CloudInfinite 模块在 APP 启动时已自动将 AVIF 解码器加入到 SDWebImage 解码器队列中,在加载解码器时自动找到 AVIF 解码器来解码图片。支持动图,无需额外操作。使用时与 SDWebImage 使用没有任何区别。

Objective-C

[imageView sd_setImageWithURL:[NSURL URLWithString:@"AVIF 图片链接"]];

swift

UIImageView() .sd_setImage(with: NSURL.init(string: "AVIF 图片链接"))

数据万象AVIF SDK其他功能

一、基础解码器

用于直接将AVIF数据解码为bitmap、UIImage,以及判断图片数据是否是AVIF格式

Android

import com.tencent.qcloud.image.avif.Avif;// 图片的字节数组byte[] buffer = new byte[XXX];// 是否是 AVIF 格式boolean isAvif = Avif.isAvif(buffer);// 是否是 AVIF 动图 boolean isAvis = Avif.isAvis(buffer);// 原图解码Bitmap bitmap = Avif.decode(buffer);// 宽度等比解码// 目标宽度int dstWidth = 500; Bitmap bitmap = Avif.decode(buffer, dstWidth);// 区域缩放解码// 区域左上角x坐标int x = 0;// 区域左上角y坐标int y = 0;// 区域宽度int width = 100;// 区域高度int height = 100;// 缩放比, 大于1的时候才生效,小于等于1的情况下不作缩放int inSampleSize = 2;Bitmap bitmap = Avif.decode(buffer, x, y, width, height, inSampleSize);

iOS

#import "AVIFDecoderHelper.h"#import "UIImage+AVIFDecode.h"//判断是否是 AVIF 格式以及动图格式// data为图片NSData类型数据BOOL isAVIF = [AVIFDecoderHelper isAVIFImage:data];//解码 AVIF 图片// data为图片NSData类型数据UIImage * image = [UIImage AVIFImageWithContentsOfData:data];/ data为图片NSData类型数据// 缩小两倍 并指定解码的范围( rect 以原图为基准)UIImage * image = [UIImage AVIFImageWithContentsOfData:imageData scale:2 rect:CGRectMake(x, y, width, height)];

二、Android超大图采样图片库

1. 安装 subsampling-scale-image-view 和 AVIF SDK

implementation 'com.qcloud.cos:avif:1.1.0'   implementation 'com.davemorrissey.labs:subsampling-scale-image-view:3.10.0'// AndroidX请使用// implementation 'com.davemorrissey.labs:subsampling-scale-image-view-androidx:3.10.0'

2. 获取 SubsamplingScaleImageView 控件并注册解码器

SubsamplingScaleImageView subsamplingScaleImageView = findViewById(R.id.subsampling_scale_image_view);// 设置AVIF图片解码器subsamplingScaleImageView.setBitmapDecoderClass(AvifSubsamplingImageDecoder.class);subsamplingScaleImageView.setRegionDecoderClass(AvifSubsamplingImageRegionDecoder.class);

3. 使用 subsampling-scale-image-view 加载图片

像普通jpg png图片那样加载图片即可,请参见 subsampling-scale-image-view 官方文档。

// 加载 uri 图片subsamplingScaleImageView.setImage(ImageSource.uri(uri));// 加载 assets 图片subsamplingScaleImageView.setImage(ImageSource.asset("test.avif"));// 加载 resource 图片subsamplingScaleImageView.setImage(ImageSource.resource(R.raw.avif));

总结

总之就是数据万象AVIF SDK帮您封装了AVIF解码器、对Android iOS常用的图片库生态也做了封装,真正让您一分钟就能将AVIF图片显示到APP中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_275860.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PyTorch笔记

Tensor torch中的Tensor是一种数据结构&#xff0c;使用上与Python的list、numpy的array、ndarray等数据结构类似&#xff0c;可以当成一个多维数组来用。 数学上对张量有特定定义&#xff0c;但通常理解为多维数组即可。 生成Tensor&#xff1a;torch包中提供了直接生成Tens…

A*算法简介

A*算法是一种启发式的搜索算法&#xff0c; A*算法在某种程度上和广度优先搜索&#xff08; BFS&#xff09;、 深度优先搜索&#xff08; DFS&#xff09; 类似&#xff0c; 都是按照一定的原则确定如何展开搜索的节点树状结构。 A*可以认为是一种基于“ 优点” 的搜索算法。搜…

值得推荐的 5 大 Android 手机密码解锁器

大多数 Android 用户使用唯一密码来保护他们的手机和重要数据。因此&#xff0c;忘记密码并被锁定在手机之外可能会令人沮丧。在这种情况下&#xff0c;使用安卓手机密码解锁器来解决问题是一个明智的选择。本文将介绍2023 年排名前 5 的 Android 手机密码解锁器。不要错过。 电…

Kubernetes容器运行原理

Kubernetes容器概述from 网络容器能够有效地虚拟化主机操作系统&#xff08;或内核&#xff09;并将应用程序的依赖项与同一台机器上运行的其他容器隔离开。在容器出现之前&#xff0c;在同一个虚拟机 (VM) 上部署了多个应用程序&#xff0c;共享依赖项的任何更改都可能导致奇怪…

EMQX Enterprise 新版本发布:新增 Apache IoTDB 支持、HStreamDB 最新版以及 MongoDB 6.0 适配

我们很高兴地宣布&#xff1a;EMQX Enterprise 4.4.15 和 4.4.16 版本现已正式发布&#xff01; 本次发布增加了 Apache IoTDB 集成支持以满足工业制造海量数据存储与分析的需求&#xff0c;同时对最新版本的 HStreamDB v0.14.0 和 MongoDB&#xff08;v6.0&#xff09;进行了…

IOC/DI配置管理第三方bean

IOC/DI配置管理第三方bean1&#xff0c;IOC/DI配置管理第三方bean1.1 案例:数据源对象管理1.1.1 环境准备1.1.2 思路分析1.1.3 实现Druid管理步骤1:导入druid的依赖步骤2:配置第三方bean步骤3:从IOC容器中获取对应的bean对象步骤4:运行程序1.2 加载properties文件1.2.1 第三方b…

花青素类荧光染料Sulfo-Cy3.5 NH2,Sulfo-Cyanine3.5 amine,磺酸基-花青素Cyanine3.5 氨基,可以用来标记蛋白

Sulfo-Cyanine3.5 amine&#xff0c;Sulfo-Cy3.5 NH2&#xff0c;Sulfo-Cyanine3.5 NH2&#xff0c;Sulfo-Cy3.5 amine&#xff0c;磺酸基-花青素Cy3.5 氨基一、产品规格&#xff1a; 1.CAS号&#xff1a;N/A 2.分子式&#xff1a;C44H52K2N4O13S4 3.分子量&#xff1a;1051.36…

如何远程连接服务器

在如今的互联网时代&#xff0c;远程连接服务器已经成为了许多人必不可少的技能。通过远程连接服务器&#xff0c;我们可以随时随地访问和管理远程服务器&#xff0c;而无需亲身前往。那么如何远程连接服务器呢?远程连接服务器注意事项是什么&#xff1f;今天小编就来跟大家分…

不用vdom的lit框架学习3:代码结构初步解析

这是lit框架的系列学习文章&#xff0c;跳转查看其他章节 不用vdom的lit框架学习1&#xff1a;安装和编译不用vdom的lit框架学习2&#xff1a;挠头的web component&#xff08;兼容性说明&#xff0c;必看&#xff09;不用vdom的lit框架学习3&#xff1a;代码结构初步解析 在补…

牛客Verilog题目(1)——超前进位加法器

今天起&#xff0c;开始统计一些做的比较难的或者可以扩展知识面的Verilog题目。 第一题来自牛客->verilog快速入门->第12题 4个二进制全加器串联的四位加法器 在此之前需要了解全加器、4个1位二进制全加器串联的四位加法器。再了解为什么要用这种超前进位加法器。’ 全…

APP小程序移动商城系统 助力电商企业拓客引流

近几年电商企业的发展湿透持续旺盛&#xff0c;加上人们线上支付习惯的普及&#xff0c;使网上商城取得了稳健的发展。网上商城系统是在为个人用户和企业用户提供人性化的全方位服务&#xff0c;为用户创造轻松预约的购物环境&#xff0c;满足消费者多样化的购物需求&#xff0…

Microsoft Remote Desktop for Mac(远程桌面连接工具)

Microsoft Remote Desktop for Mac是一款Mac OS平台上的远程桌面控制软件来自微软&#xff0c;你可以通过Microsoft Remote Desktop for mac来控制Windows或者Mac OS设备完成你的工作。microsoft远程桌面为mac译名为微软远程桌面软件&#xff0c;这是一款Mac OS平台上的远程桌面…

OpenAI Translator | 基于ChatGPT API全局翻译润色解析插件

简介 OpenAI Translator&#xff0c;一款基于 ChatGPT API 的划词翻译浏览器插件和跨平台桌面端应用&#xff0c;使用 ChatGPT API 进行划词翻译和文本润色&#xff0c;借助了 ChatGPT 强大的翻译能力&#xff0c;帮助用户更流畅地阅读外语和编辑外语&#xff0c;允许跨 55 种…

Redis简单介绍-安装基本类型及其操作命令

文章目录1. redis网址2. 安装redis3. redis10大类型及操作命令3.1 key操作命令3.1.1 redis-server重启后数据不会消失3.1.2 keys * 显示所有的key3.1.3 exists 判断key是否存在&#xff0c;存在则计数加13.1.4 type 显示出类型3.1.5 del 删除指定key&#xff0c;返回结果为被删…

人工智能会给普通人带来哪些改变

最近人工智能太火了&#xff0c;很多人都听说了&#xff0c;尤其是大语言模型。可以让我们像和真人聊天一样&#xff0c;与AI对话&#xff0c;根据你所问的问题&#xff0c;AI可能像一个老师&#xff0c;像一个老人&#xff0c;像一个智者回答你的几乎所有问题。这也把有些人吓…

[openwrt]network配置生成和下发

配置脚本调用 network的配置处理入口为:/etc/init.d/boot,函数调用: /bin/config_generate脚本内容如下:

SpringCloud搭建微服务之Gateway+Jwt实现统一鉴权

1. 概述 在微服务项目中&#xff0c;需要对整个微服务系统进行权限校验&#xff0c;通常有两种方案&#xff0c;其一是每个微服务各自鉴权&#xff0c;其二是在网关统一鉴权&#xff0c;第二种方案只需要一次鉴权就行&#xff0c;避免了每个微服务重复鉴权的麻烦&#xff0c;本…

服务端测试知识汇总

目录 服务端测试思想 经济学⻆度 ⾦字塔模型 技术⻆度 HTTP协议 三次握⼿ HTTP完整请求 通信模式 URI信息 请求⽅法 请求状态码 请求/响应头 常⽤请求数据格式 COOKIE请求流程 SESSION请求流程 TOKEN请求流程 API测试维度 单接⼝测试 多个接⼝测试 …

【tensorboard】深度学习的日志信息events.out.tfevents文件可视化工具

在用深度学习模型训练完模型后&#xff0c;会有一些events.out.tfevents格式的日志信息文件&#xff0c;如下图&#xff1a; 在这类文件需要用tensorboard进行打开&#xff0c;并且查看训练过程的信息内容。 1. tensorboard安装 pip install tensorboard -i https://pypi.do…

从零开始学Python第06课:循环结构

我们在写程序的时候&#xff0c;极有可能遇到需要重复执行某条指令或某些指令的场景&#xff0c;例如我们需要每隔1秒钟在屏幕上输出一次“hello, world”并持续输出一个小时。如下所示的代码可以完成一次这样的操作&#xff0c;如果要持续输出一个小时&#xff0c;我们就需要把…