HarmonyOS 鸿蒙Next 图片BGRA转BGR格式

发布于 1周前 作者 eggper 来自 鸿蒙OS

HarmonyOS 鸿蒙Next 图片BGRA转BGR格式

最近在开发鸿蒙的项目中,遇到需要将四通道的图片转换成三通道,查找文档发现ArkTS没有支持的API,最后通过调用Native的Opencv方法实现,具体的实现逻辑给大家分享一下;

1.首先需要继承鸿蒙化的opencv c++的库

2.通过napi方法将pixelMap对象转换成cvMat对象,然后调用opencv的方法进行通道的转换

OHOS::Media::OhosPixelMapInfo pixelMapInfo;
OH_GetImageInfo(env, args[0], &pixelMapInfo);
void *frame_data = nullptr;
OHOS::Media::OH_AccessPixels(env, args[0], &frame_data);

unsigned char *src = (unsigned char *)frame_data;

cv::Mat oriMat = cv::Mat(frameH, frameW, CV_8UC4, src);


cv::Mat dstMat;
cv::cvtColor(oriMat, dstMat, cv::COLOR_BGRA2BGR);

输出的dstMat就是三通道的图片

3.再将cvMat转换成pixelMap返回给UI层

OHOS::Media::OhosPixelMapCreateOps opts = {.width = static_cast<uint32_t>(pixelMapInfo.width),
.height = static_cast<uint32_t>(pixelMapInfo.height),
.pixelFormat = 3,
.editable = 0,
.scaleMode = 0};
napi_value res;
OHOS::Media::OH_PixelMap_CreatePixelMap(
env, opts, dstMat.data, pixelMapInfo.width * pixelMapInfo.height * dstMat.channels(), &res);
OH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, TAG, “Exit GetArrayToMat()”);

return res;// res对象就是pixelMap

4 回复

求助, 在app napi 调用opencv库时,直接崩溃掉,

能否提供下CMakeLists.txt 的 配置

您好,适配鸿蒙的opencv c++库是怎么得到的?自己在Ubuntu用NDK编译的库引入后直接闪退

老哥,找到方法导入opencv c++库没有

在HarmonyOS鸿蒙Next系统中,将BGRA格式的图片转换为BGR格式,可以通过以下几种方式实现:

方法一:使用OpenCV库

  1. 继承鸿蒙化的OpenCV C++库。
  2. 将PixelMap对象转换为cv::Mat对象,利用OpenCV的cvtColor函数进行通道转换,即cv::cvtColor(oriMat, dstMat, cv::COLOR_BGRA2BGR)
  3. 将转换后的cv::Mat对象重新转换为PixelMap,并返回给UI层。

方法二:在JS层处理

  1. 在JS层获取到image资源对象,生成PixelMap(默认是BGRA_8888格式)。
  2. 调用readPixelsToBuffer方法读取图像像素数据到ArrayBuffer。
  3. 创建一个新的Uint8Array,遍历原ArrayBuffer,去除Alpha通道,只保留BGR数据。
  4. 将处理后的Uint8Array重新转换为ArrayBuffer,或通过其他方式传入Native层进行后续处理。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部