HarmonyOS 鸿蒙Next 读取rawfile中的图片时,使用arkts方法读取和使用napi方法读取的图片内容不一样
arkts侧的代码是:
let context = getContext(this);
let resourceMgr = context.resourceManager;
console.log("!!!### fileRealContent: ", JSON.stringify(resourceMgr.getRawFileContentSync('end.png')))
NAPI的代码是:
//获取rawfile文件内容 GetRawFileContent
napi_value CreateJsArrayValue(napi_env env, std::vector<uint8_t> &data, long length)
{
napi_value buffer;
napi_status status = napi_create_external_arraybuffer(env, data.data(), length,
[](napi_env env, void *data, void *hint) {
delete[] static_cast<char*>(data);
}, nullptr, &buffer);
if (status != napi_ok) {
return nullptr;
}
napi_value result = nullptr;
status = napi_create_typedarray(env, napi_uint8_array, length, buffer, 0, &result);
if (status != napi_ok) {
return nullptr;
}
data.clear();
return result;
}
napi_value NapiReadRawFile::GetRawFileContent(napi_env env, napi_callback_info info)
{
size_t argc = 2;
napi_value argv[2] = { nullptr };
// 获取参数信息
napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
// argv[0]即为函数第一个参数Js资源对象,OH_ResourceManager_InitNativeResourceManager转为Native对象。
NativeResourceManager *mNativeResMgr = OH_ResourceManager_InitNativeResourceManager(env, argv[0]);
size_t strSize;
char strBuf[256];
napi_get_value_string_utf8(env, argv[1], strBuf, sizeof(strBuf), &strSize);
std::string filename(strBuf, strSize);
// 获取rawfile指针对象
RawFile *rawFile = OH_ResourceManager_OpenRawFile(mNativeResMgr, filename.c_str());
if (rawFile == nullptr) {
return nullptr;
}
// 获取rawfile大小并申请内存
long len = OH_ResourceManager_GetRawFileSize(rawFile);
CVLog::Log(CVLog::eLOGInfo, "!!!### CPP zxp the len = %d", len);
// 使用vector代替
// std::unique_ptr<uint8_t[]> data= std::make_unique<uint8_t[]>(len);
std::vector<uint8_t> data(len);
// 一次性读取rawfile全部内容
int res = OH_ResourceManager_ReadRawFile(rawFile, data.data(), len);
// 多次部分读取rawfile, 每次读取100 Bytes。获取全部内容
// long offset = 0;
// while (OH_ResourceManager_GetRawFileRemainingLength(rawFile) > 0) {
// OH_ResourceManager_ReadRawFile(rawFile, data.get() + offset, 100);
// offset += 100;
// }
// 关闭打开的指针对象
OH_ResourceManager_CloseRawFile(rawFile);
OH_ResourceManager_ReleaseNativeResourceManager(mNativeResMgr);
// 转为js对象
return CreateJsArrayValue(env, data, len);
}
NAPI的代码时参考官方文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V13/rawfile-guidelines-V13
我做的修改是使用vector代替了uint8_t[]
然后在arkts侧调用NAPI的方法,将图片的字节数组输出
console.log("!!!### fileContent: ", JSON.stringify(fileDate)); 对比两次输出的结果,发现字节数组中的前八位不相同。然后也输出了资源描述符,偏移、长度都一样,除了资源标识符不同。但是我使用同一个resourceManager,不理解。
总之不知道为什么,获得的同一个图片的字节数组不一样。
更多关于HarmonyOS 鸿蒙Next 读取rawfile中的图片时,使用arkts方法读取和使用napi方法读取的图片内容不一样的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
好吧,是CreateJsArrayValue方法里的代码有点问题。
我自己写了个将data中的数据转成array输出给arkts侧,然后在arkts侧数据发现输出正确。
// 转为js对象
napi_value arr;
napi_create_array_with_length(env, len, &arr);
for(int i = 0; i < len; i++){
napi_value temp;
napi_create_uint32(env, data[i], &temp);
napi_set_element(env, arr, i, temp);
}
return arr;
更多关于HarmonyOS 鸿蒙Next 读取rawfile中的图片时,使用arkts方法读取和使用napi方法读取的图片内容不一样的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙Next系统中,读取rawfile中的图片时,如果通过arkts方法和napi方法读取到的图片内容不一样,可能是由于两种API在内部处理图片数据时采用了不同的方式或标准。
arkts方法通常更贴近于鸿蒙系统的原生开发框架,可能在处理图片资源时进行了优化或特定的格式转换。而napi方法作为跨平台的接口,可能保持了更为通用的处理方式,没有针对鸿蒙系统进行特定的优化。
这种差异可能体现在图片的像素格式、颜色空间、分辨率等方面。例如,arkts方法可能自动将图片转换为适合当前显示设备的格式,而napi方法则可能保留了图片的原始格式。
为了解决这个问题,你可以检查以下几点:
- 确认arkts和napi方法读取图片的具体实现方式,了解它们在处理图片时的差异。
- 对比两种方法读取到的图片数据,找出具体的不同之处。
- 根据应用需求,选择更适合的方法读取图片,或者对读取到的图片数据进行适当的转换和处理。
如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html 。