1

场景一:展示系统原生支持的图片格式编解码的代码实现

// 获取resourceManager资源管理 
const context : Context = getContext(this); 
const resourceMgr : resourceManager.ResourceManager = context.resourceManager; 
// 创建ImageSource 
resourceMgr.getRawFileContent('test.jpg').then((fileData : Uint8Array) => { 
  console.log("Succeeded in getting RawFileContent") 
  // 获取图片的ArrayBuffer 
  const buffer = fileData.buffer.slice(0); 
  const imageSource : image.ImageSource = image.createImageSource(buffer); 
}).catch((err : BusinessError) => { 
  console.error("Failed to get RawFileContent") 
}); 
// 创建PixelMap 
imageSource.createPixelMap().then((pixelMap: image.PixelMap) => { 
   console.log("Succeeded in creating PixelMap") 
}).catch((err : BusinessError) => { 
   console.error("Failed to creating PixelMap") 
});

场景二:使用第三方库进行系统原生不支持的常用图片格式解码进行解码

avif格式

2.1 将libavif库添加到工程中,参考链接:libavif三方库说明

2.1.1 编译第三方库

下载本仓库

git clone https://gitee.com/openharmony-sig/tpc_c_cplusplus.git --depth=1

三方库目录结构

o    tpc_c_cplusplus/thirdparty/libavif   #三方库libavif的目录结构如下 
o    ├── docs                               #三方库相关文档的文件夹 
o    ├── HPKBUILD                           #构建脚本 
o    ├── HPKCHECK                           #自动化测试脚本 
o    ├── SHA512SUM                          #三方库校验文件 
o    ├── README.OpenSource                  #说明三方库源码的下载地址,版本,license等信息 
o    ├── README_zh.md                       #三方库说明文档 
├── OAT.xml                            #开源扫描相关文件

在tpc_c_cplusplus/lycium目录下编译三方库

编译环境的搭建参考准备三方库构建环境

cd tpc_c_cplusplus/lycium 
./build.sh libavif

三方库头文件及生成的库

在lycium目录下会生成usr目录,该目录下存在已编译完成的32位和64位三方库和头文件

libavif/arm64-v8a   libavif/armeabi-v7a

2.1.2 应用中使用第三方库

拷贝动态库到\entry\libs${OHOS_ARCH}\目录: 动态库需要在\entry\libs${OHOS_ARCH}\目录,才能集成到hap包中,所以需要将对应的so文件拷贝到对应CPU架构的目录

在IDE的cpp目录下新增thirdparty目录,将编译生成的库拷贝到该目录下,如下图所示

image.png

在最外层(cpp目录下)CMakeLists.txt中添加如下语句

#将三方库加入工程中 
target_link_libraries(entry PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../../../libs/${OHOS_ARCH}/libaom.a 
${CMAKE_CURRENT_SOURCE_DIR}/../../../libs/${OHOS_ARCH}/libavif.so.16 
${CMAKE_CURRENT_SOURCE_DIR}/../../../libs/${OHOS_ARCH}/libgmock.a 
${CMAKE_CURRENT_SOURCE_DIR}/../../../libs/${OHOS_ARCH}/libgmock_main.a 
${CMAKE_CURRENT_SOURCE_DIR}/../../../libs/${OHOS_ARCH}/libgtest.a 
${CMAKE_CURRENT_SOURCE_DIR}/../../../libs/${OHOS_ARCH}/libgtest_main.a 
${CMAKE_CURRENT_SOURCE_DIR}/../../../libs/${OHOS_ARCH}/libjpeg.a 
${CMAKE_CURRENT_SOURCE_DIR}/../../../libs/${OHOS_ARCH}/libpng.a 
${CMAKE_CURRENT_SOURCE_DIR}/../../../libs/${OHOS_ARCH}/libpng16.a 
${CMAKE_CURRENT_SOURCE_DIR}/../../../libs/${OHOS_ARCH}/libyuv.so 
) 
#将三方库的头文件加入工程中 
target_include_directories(entry PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/libavif/${OHOS_ARCH}/include 
${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/libyuv/${OHOS_ARCH}/include 
${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/libaom/${OHOS_ARCH}/include 
${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/jpeg/${OHOS_ARCH}/include 
${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/libpng/${OHOS_ARCH}/include 
${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/googletest/${OHOS_ARCH}/include)

2.1.3 测试第三方库

三方库的测试使用原库自带的测试用例来做测试,准备三方库测试环境

进入到构建目录(arm64-v8a-build为构建64位的目录,armeabi-v7a-build为构建32位的目录),执行如下操作步骤:

配置环境变量 执行如下命令:

export LD_LIBRARY_PATH=${LYCIUM_ROOT}/usr/libyuv/${ARCH}/lib:${LYCIUM_ROOT}/usr/libavif/${ARCH}/lib:${LYCIUM_ROOT}/usr/jpeg/${ARCH}/lib:${LYCIUM_ROOT}/usr/libaom/${ARCH}/lib:${LYCIUM_ROOT}/usr/libpng/${ARCH}/lib:$LD_LIBRARY_PATH

注意:LYCIUM_ROOT代表lycium所在目录的绝对路径;ARCH代表构建架构,64位为arm64-v8a,32位为armeabi-v7a。

执行测试项:

ctest

image.png

实现方式参考上述heif格式,策略相通均为C++侧读取图片数据转换为pixelMap返回给TS侧


HarmonyOS码上奇行
7.5k 声望2.9k 粉丝