You need to enable JavaScript to run this app.
导航
集成 HEIF 解码库
最近更新时间:2024.09.26 19:40:43首次发布时间:2021.11.18 18:20:04

本文为您介绍 veImageX 自研 Android 端 HEIF 解码库的接入流程。

适用版本

本文档适用于 Android 4.0 及以上开发版本。

前提条件

您已完成独立 HEIF 编解码库的集成准备

注意事项

不支持对使用 Grid 编码生成的带有 aplha 通道的 heif 图进行解码处理。

添加 Maven 仓库

确保 project 根目录下的build.gradle下配置服务,代码示例如下所示:

maven {
    url 'https://artifact.bytedance.com/repository/Volcengine/'
    // 最新版本号获取地址:https://artifact.bytedance.com/repository/Volcengine/
}

获取 SDK 最新版本号

请参考发布历史,获取 SDK 最新版本号。

添加 SDK 依赖

在 module 目录下的build.gradle文件中的dependencies中添加 SDK 依赖,并填入获取的最新版本号。代码示例如下所示:

implementation 'com.bytedance.fresco:authorization:xxx'//添加授权认证+云控配置
implementation 'com.bytedance.fresco:nativeheif:xxx' //heif 解码

说明

请确保您添加的 SDK 各依赖版本号一致。

配置授权

在自定义的ApplicationonCreate方法中执行以下代码:

List<String> encodedAuthCode = new ArrayList<>();
encodedAuthCode.add("xxxxxxxxxxxxxxxxxxxxxxxxx");

InitConfig initConfig = new InitConfig(
        this,             // Application Context
        "000000",         // App id, 如实填写
        "sample",         // App Name,暂未用到,传入app名称
        "debug",          // channel,暂未用到,传入例如OPPO 
        "0.0.1",          // App的versionName, 如实填写
        "1",              // App的versionCode, 如实填写
        "48144589260",    // device id,暂未用到
        InitConfig.CHINA, // App上线的区域,如实填写
        "M2ZmYzkzZjUtN2", // Token,如实填写,您可在 接入准备-购买授权 获取Token
        encodedAuthCode   // 授权码List<String>,如实填写,您可在 接入准备-购买授权 获取授权码
);
CloudControl.init(initConfig);

解码示例

使用 HEIF 解码,代码示例如下所示:

byte[] data; // 图片原始数据
int[] meta = Heif.parseSimpleMeta(data, data.length);
HeifData heifData = Heif.toRgba(data, data.length, true, 1, 0, 0, meta[1], meta[0]);
Bitmap bitmap = heifData.newBitmap(null);

解码接口介绍

  • com.bytedance.fresco.nativeheif.Heif 类

com.bytedance.fresco.nativeheif.Heif为解码 HEIC 静图的接口类,可将原图解码为 rgba、rgb565 数据。

/**
 * 将原始图片解码为 rgba 数据。
 * @param data 图片原始数据
 * @param size 数据大小
 * @param wpp 暂未使用,请传入 false
 * @param inSample 降采样,取值>=1
 * @param x 解码起始的横坐标,请勿超过图片边界
 * @param y 解码起始的纵坐标,请勿超过图片边界
 * @param height 期望解码的高度,与y坐标结合使用,请勿超过图片边界
 * @param width 期望解码的宽度,与x坐标结合使用,请勿超过图片边界
 * @return 对解码后的byte[]数据的封装,要转为Bitmap,请调用HeifData.newBitmap()接口
 */
public static native HeifData toRgba(byte[] data, int size, boolean wpp, int inSample, int x, int y, int height, int width);

/**
 * 将原始图片解码为 rgb565 数据。
 * 参数意义和 toRgba 相同
 */
public static native HeifData toRgb565(byte[] data, int size, boolean wpp, int inSample, int x, int y, int height, int width);

/**
 * @param data 图片原始数据
 * @param size 数据大小
 * @return meta 数据,数组元素 10 个,值依次表示:宽,高,图片角度(顺指针角度,取值0,90,180,270),是否为动图(0:静图,1:动图),动图时长,是否含有缩略图(0:没有,1:有),缩略图下标,缩略图大小,是否含有透明通道(0:没有,1:有),位深。
 */
public static native int[] parseSimpleMeta(byte[] data, int size);

/**
 * @param data 图片原始数据
 * @param isRgba 是否有透明通道,true:有透明通道;false:无透明通道
 * @param inSample 降采样,取值>=1
 * @return Bitmap对象 采用该方法可以解决带icc信息的heic图色差问题 (1.1.0.1-tob及之后版本支持)
 */
public static Bitmap getBitmap(byte[] data, boolean isRgba, int inSample);
  • com.bytedance.fresco.nativeheif.HeifData 类

com.bytedance.fresco.nativeheif.HeifData为解码后数据的封装类。

public class HeifData {
    public final byte[] data; // 解码后的字节数据
    public final int width;   // 解码后图片的宽
    public final int height;  // 解码后图片的高

    /** 
     * 将byte[]字节数据转为 bitmap。
     * @param config Bitmap.Config,如果传入null则默认使用Bitmap.Config.ARGB_8888
     * @return Bitmap
     */
    public Bitmap newBitmap(Config config) {}
}