HarmonyOS 鸿蒙Next:BGRA的图片如何转换成BGR并传入Native层
HarmonyOS 鸿蒙Next:BGRA的图片如何转换成BGR并传入Native层 需要把四通道BGRA格式的图片转换成三通道BGR格式的图片。我这边参考图片处理相关Api也没有解决,不清楚问题出在哪里
问题场景描述:
-
在JS层获取到image资源对象,然后生成PixelMap(默认是BGRA_8888)的格式,接着调用readPixelsToBuffer方法读取图像像素数据,结果写入ArrayBuffer里,最后移除alpha参数,写入另一个三通道的ArrayBuffer imageBGRBuffer中
-
在实现1成功的情况下,需要把imageBGRBuffer传入Native层,通用调用napi接口方法napi_get_arraybuffer_info转换ArrayBuffer,然后强转成unsigned char *类型传入c++的方法使用
没有得到期望的结果,目前不清楚是哪一步逻辑有问题,是图片格式转换出错,还是Native层出错
更多关于HarmonyOS 鸿蒙Next:BGRA的图片如何转换成BGR并传入Native层的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
ArrayBuffer为内存中的二进制数据,无法直接进行读写,需要转换为Uint8Array后才能进行读写,代码示例:
let readBuffer: ArrayBuffer = new ArrayBuffer(pixelBytes);
let writeBuffer: ArrayBuffer = new ArrayBuffer(pixelBytes);
pixelMap.readPixelsToBuffer(readBuffer).then(() => {
let view = new Uint8Array(readBuffer);
let viewB = new Uint8Array(pixelBytes);
for (let i = 0, j = 0; i < pixelBytes; i = i + 4, j = j + 3) {
viewB[j] = view[i];
viewB[j + 1] = view[i + 1];
viewB[j + 2] = view[i + 2];
}
writeBuffer = viewB.buffer;
}
数据格式是前者,B,G,R,A,B,G,R,A…这种
更多关于HarmonyOS 鸿蒙Next:BGRA的图片如何转换成BGR并传入Native层的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS中,将BGRA格式的图片转换成BGR格式并传入Native层,通常涉及到位操作和数据传输。以下是实现这一转换的基本步骤:
-
获取BGRA数据:首先,确保你已经获取到BGRA格式的图像数据,这通常是一个包含RGBA(或BGRA,取决于具体实现)值的字节数组。
-
转换BGRA到BGR:由于BGRA和BGR的主要区别在于Alpha通道(A)的位置,你需要遍历整个数组,忽略Alpha通道,只处理蓝(B)、绿(G)、红(R)三个通道。具体来说,对于每个像素,BGRA的顺序是[B, G, R, A],而BGR的顺序是[B, G, R]。因此,你可以直接复制B和G的值,同时复制R的值到相应的位置,跳过A值。
-
传输数据到Native层:转换完成后,你可以使用HarmonyOS提供的JNI(Java Native Interface,尽管要求不使用Java相关内容,但此处仅作概念说明,实际实现应基于HarmonyOS的Native通信机制)或其他Native通信方法(如内存映射、文件传输等)将BGR数据传递到Native层。
-
在Native层处理数据:Native层接收数据后,即可按BGR格式进行处理。
如果问题依旧没法解决请联系官网客服, 官网地址是 https://www.itying.com/category-93-b0.html