本文为您介绍 veImageX 自研 Android 端 HEIF 解码库的接入流程。
本文档适用于 Android 4.0 及以上开发版本。
您已完成独立 HEIF 编解码库的集成准备。
不支持对使用 Grid 编码生成的带有 aplha 通道的 heif 图进行解码处理。
确保 project 根目录下的build.gradle
下配置服务,代码示例如下所示:
maven { url 'https://artifact.bytedance.com/repository/Volcengine/' // 最新版本号获取地址:https://artifact.bytedance.com/repository/Volcengine/ }
请参考发布历史,获取 SDK 最新版本号。
在 module 目录下的build.gradle
文件中的dependencies
中添加 SDK 依赖,并填入获取的最新版本号。代码示例如下所示:
implementation 'com.bytedance.fresco:authorization:xxx'//添加授权认证+云控配置 implementation 'com.bytedance.fresco:nativeheif:xxx' //heif 解码
说明
请确保您添加的 SDK 各依赖版本号一致。
在自定义的Application
的onCreate
方法中执行以下代码:
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
为解码 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
为解码后数据的封装类。
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) {} }