【关键字】
ArkTS / Image组件 / 图片色域 / native / C++
【问题描述】
在native侧通过OH_PixelMap_CreatePixelMap (napi_env env, OhosPixelMapCreateOps info, void *buf, size_t len, napi_value *res)创建的pixelMap,传给ArkTS侧给Image组件进行展示时,会报出colorspace的错误,同时Image展示的内容的色域也是不对的。
错误信息如下:
02-26 20:00:09.150 9953-9953 C02b05/ImageSourceNapi com.examp...rsdkdemo E RawFileDescriptor mismatch02-26 20:00:09.156 9953-9953 C01400/JsColorSpace com.examp...rsdkdemo E GetColorSpaceByJSObject: [NAPI]GetColorSpaceByJSObject::jsColorSpace is nullptr02-26 20:00:09.156 9953-9953 C02b05/ImageSourceNapi com.examp...rsdkdemo E Get colorspace by JS object failed
图1 originImage是原图,图2 renderImage是native传给ArkTS的图片。
图1 originImag
图2 renderImage
ArkTS层代码:
const fileName = `test/00${this._imageIndex}.png`;
const fileData : Uint8Array = await resourceMgr.getRawFileContent(fileName);
// 获取图片的ArrayBuffer
const buffer = fileData.buffer.slice(0);
// 创建ImageSource实例
const imageSource : image.ImageSource = image.createImageSource(buffer);
// 设置解码参数DecodingOptions,解码获取PixelMap图片对象
let decodingOptions : image.DecodingOptions = {
editable: true,
desiredPixelFormat: image.PixelMapFormat.RGBA_8888,// 注:设置为BGRA_8888效果是对的
}
// 创建pixelMap并进行简单的旋转和缩放const pixelMap : image.PixelMap = await imageSource.createPixelMap(decodingOptions);
C++代码:
void SLRender::notifyShowDebugImage(NativePixelMap *pixelMap) {
napi_value callbackArg[1] = {nullptr};
if (pixelMap == nullptr) {
SLCppLogError(SLREXComponentTag, "SLRender::notifyShowDebugImage pixelMap is null");
return;
}
if (_env == nullptr || _callbackRef == nullptr) {
SLCppLogError(SLREXComponentTag, "SLRender::notifyShowDebugImage _env or _callbackRef is null");
return;
}
OhosPixelMapInfos infos;
OH_PixelMap_GetImageInfo(pixelMap, &infos);
OhosPixelMapCreateOps createInfos;
createInfos.width = infos.width;
createInfos.height = infos.height;
createInfos.pixelFormat = infos.pixelFormat;
int32_t editable = 0;
OH_PixelMap_GetIsEditable(pixelMap, &editable);
createInfos.editable = editable;
int32_t alpha = 0;
OH_PixelMap_IsSupportAlpha(pixelMap, &alpha);
createInfos.alphaType = alpha;
createInfos.scaleMode = 0;
// 获取图片数据
void *addrPtr = nullptr;
OH_PixelMap_AccessPixels(pixelMap, &addrPtr);
OH_PixelMap_CreatePixelMap(_env, createInfos, addrPtr, infos.rowSize * infos.height, callbackArg);
OH_PixelMap_UnAccessPixels(pixelMap);
addrPtr = nullptr;
napi_value callback = nullptr;
napi_get_reference_value(_env, _callbackRef, &callback);
// 执行回调函数
napi_value result;
napi_value undefined;
napi_get_undefined(_env, &undefined);
napi_call_function(_env, undefined, callback, 1, callbackArg, &result);
}
【解决方案】
当前ArkTS和native侧接口设计的只接受BGRA数据,其他的格式会出现渲染异常。