HarmonyOS 鸿蒙Next 读取rawfile中的图片时,使用arkts方法读取和使用napi方法读取的图片内容不一样

发布于 1周前 作者 caililin 最后一次编辑是 5天前 来自 鸿蒙OS

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

2 回复

好吧,是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

回到顶部