首页 > 其他分享 >一分钟让您的APP支持AVIF图片

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

时间:2024-07-10 18:11:56浏览次数:17  
标签:AVIF APP 一分钟 解码器 new com class 图片

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 创建类似的注册类
@GlideModule
public 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 Pipeline
ImagePipelineConfig config = ImagePipelineConfig.newBuilder(context)
        .setImageDecoderConfig(imageDecoderConfig)
        .build();
// 初始化 Fresco
Fresco.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中。

标签:AVIF,APP,一分钟,解码器,new,com,class,图片
From: https://www.cnblogs.com/txycsig/p/18294743

相关文章

  • 撸包小游戏对接广告联盟APP系统开发源码搭建
    “撸包小游戏广告联盟APP”源码搭建涉及多个关键步骤,以下是一个简化的流程:市场调研与需求分析:对市场进行深入调研,了解目标用户群体和他们的需求。分析竞争对手的小游戏和广告策略,确定自己小游戏的特色和定位。游戏开发:根据市场调研的结果,设计并开发具有吸引力的撸包小......
  • 海外交友一对一社交软件APP开发搭建
    海外交友一对一软件APP的开发源码搭建是一个复杂但有序的过程,以下是基于搜索结果中提供的信息,概括的搭建步骤和注意事项:市场调研和需求分析:深入了解海外交友市场的需求和趋势,包括用户画像、使用习惯、竞争对手分析等。确定APP的核心功能和特色,如一对一视频聊天、语音聊天......
  • uniapp+vue3封装下拉框(支持单选、多选)
    子组件代码<template><viewclass="uni-select-dc"><viewref="select"class="uni-select-dc-select":class="{active:active}"@click.stop="handleSelect">......
  • 网页封包App的秘密:如何提高App的下载量和用户?
    网页封包App的秘密随着移动互联网的发展,App的下载量和用户Retention率变得越来越重要。那么,如何提高App的下载量和用户Retention率?答案就是网页封包App。网页封包App是一种将网页内容封装到App中的技术,可以实现在App中加载网页内容,提高用户体验和下载量。但是,如何实现网页封......
  • uniapp 封装蓝牙-(给设备发指令,分包数据发送)
    注意事项:1、关键点:初始化蓝牙——》uni.openBluetoothAdapter获取本机蓝牙适配器状态——》uni.getBluetoothAdapterState开始搜索蓝牙设备——》uni.startBluetoothDevicesDiscovery监听蓝牙设备(或者蓝牙设备列表,找到需要的那个)——......
  • uniapp 二次封装ui组件加class样式或修改样式在微信小程序不生效的情况
    原因:首先不论是自定义组件还是ui组件,本质上的原因都是微信小程序默认的组件隔离策略导致的。微信小程序组件隔离文档参考组件样式隔离默认情况下,自定义组件的样式只受到自定义组件wxss的影响。除非以下两种情况:指定特殊的样式隔离选项 styleIsolation 。webvie......
  • Lambda架构与Kappa架构的特性对比
        一个大数据系统架构的设计思想很大程度上受到当时技术条件和思维模式的限制。Lambda架构将批处理层和速度层分为两层,分别进行离线数据处理和实时数据处理,这样设计的根本原因在于,Lambda提出的初期是在公司中进行小范围的业务运用,当时并没有思考有没有一个计算引擎能......
  • 基于SpringBoot+Vue+uniapp的酒店客房管理系统的详细设计和实现(源码+lw+部署文档+讲
    文章目录前言详细视频演示具体实现截图技术栈后端框架SpringBoot前端框架Vue持久层框架MyBaitsPlus系统测试系统测试目的系统功能测试系统测试结论为什么选择我代码参考数据库参考源码获取前言......
  • 基于SpringBoot+Vue+uniapp的干洗店预约洗衣系统的详细设计和实现(源码+lw+部署文档+
    文章目录前言详细视频演示具体实现截图技术栈后端框架SpringBoot前端框架Vue持久层框架MyBaitsPlus系统测试系统测试目的系统功能测试系统测试结论为什么选择我代码参考数据库参考源码获取前言......
  • Matlab之App Designer 如何导入Excle数据并进行分析处理
    一、背景介绍当所需处理和分析的数据量较大时,我们需要将数据导入至Matlab中进行处理,本文将采用案例讲解的方式,详细介绍如何采用AppDesigner建立数据导入及分析GUI界面,同时展示如何对Excel的数据进行导入,并进行处理和分析。二、采用MatlabApp Designer导入Excel数据,并进行......