HarmonyOS c-api的图片组件设置图片时怎么传hsp包里的图片路径?

c-api的图片组件设置图片时,正常如下:

resource://RAWFILE/news/assets/ic\_history\_empty.png

如果图片在hsp包里,路径该怎么拼接?

阅读 554
1 个回答

resfile目录中的文件,在加载后的路径为: /data/storage/el1/bundle/library/resources/resfile/setting.jpeg

其中“library”为hsp库的名称,可以在主包路径的基础上进行调整。

通过文件加载后,在Image节点中进行展示。

int fd = open(image_path.c_str(), O_RDONLY);

OH_ImageSourceNative *source = nullptr;
Image_ErrorCode errCode = OH_ImageSourceNative_CreateFromFd(fd, &source);
if (errCode != IMAGE_SUCCESS) {
  //zerror("decodeImage sourceTest OH_ImageSourceNative_CreateFromFd failed, errCode: %_", errCode);
  return errCode;
}
//zdebug("decodeImage OH_ImageSourceNative_CreateFromFd success, fd: %_", fd);

// 创建定义图片信息的结构体对象,并获取图片信息
OH_ImageSource_Info *imageInfo;
OH_ImageSourceInfo_Create(&imageInfo);
errCode = OH_ImageSourceNative_GetImageInfo(source, 0, imageInfo);
if (errCode != IMAGE_SUCCESS) {
  //zerror("decodeImage OH_ImageSourceNative_GetImageInfo failed, errCode: %_", errCode);
  return errCode;
}

// 获取指定属性键的值
uint32_t width, height;
OH_ImageSourceInfo_GetWidth(imageInfo, &width);
OH_ImageSourceInfo_GetHeight(imageInfo, &height);
OH_ImageSourceInfo_Release(imageInfo);
//size_t originTotalSize = width * height * 3 / 2;
size_t originTotalSize = imageSizeByYUV(width,height);

size_t originTotalSize2 = width * height * 4;

outImageSize[0] = width;
outImageSize[1] = height;

//zinfo("decodeImage image path: %_, width: %_, height: %_", image_path, width, height);


// 通过图片解码参数创建PixelMap对象
OH_DecodingOptions *ops = nullptr;
OH_PixelmapNative *pixelMap = nullptr;
OH_DecodingOptions_Create(&ops);
OH_DecodingOptions_SetPixelFormat(ops, PIXEL_FORMAT_NV12);


Image_Size imageSize;
imageSize.width = width;
imageSize.height = height;
OH_DecodingOptions_SetDesiredSize(ops, &imageSize);

errCode = OH_ImageSourceNative_CreatePixelmap(source, ops, &pixelMap);
OH_DecodingOptions_Release(ops);

if (errCode != IMAGE_SUCCESS) {
  //zerror("decodeImage OH_ImageSourceNative_CreatePixelmap failed, errCode: %_", errCode);
  return errCode;
}

//size_t totalSize = width * height * 3 / 2;
size_t totalSize = imageSizeByYUV(width,height);
size_t totalSize2 = width * height * 4;

if (*dstYuvData == nullptr) {
  *dstYuvData = (unsigned char *)malloc(originTotalSize);
}
OH_LOG_Print(LOG_APP, LOG_ERROR, 999, "MyHypot", "Before OH_PixelmapNative_ReadPixels");

errCode = OH_PixelmapNative_ReadPixels(pixelMap, *dstYuvData, &totalSize);
if (errCode != IMAGE_SUCCESS) {
  //zerror("decodeImage OH_PixelmapNative_ReadPixels failed, errCode: %_", errCode);
  OH_LOG_Print(LOG_APP, LOG_ERROR, 999, "MyHypot", "Before OH_PixelmapNative_ReadPixels Error %{public}d",errCode);
  return errCode;
}
//FILE *f = fopen("/data/storage/el2/base/haps/entry/temp/pic.pic", "w");
//fwrite(*dstYuvData, totalSize, 1, f);
//fclose(f);
OH_LOG_Print(LOG_APP, LOG_ERROR, 999, "MyHypot", "OH_PixelmapNative_ReadPixels Success");

//zinfo("decodeImage readPixels done, size: %_", totalSize);

// 释放ImageSource实例
OH_ImageSourceNative_Release(source);
return IMAGE_SUCCESS;
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进