鸿蒙(API 12 Beta3版)【使用Image完成图片解码】图片开辟引导依靠JS对象 ...

打印 上一主题 下一主题

主题 1814|帖子 1814|积分 5442

图片解码指将所支持格式的存档图片解码成统一的[PixelMap],以便在应用或体系中进行图片显示或[图片处理处罚]。当前支持的存档图片格式包罗JPEG、PNG、GIF、WebP、BMP、SVG、ICO、DNG。
开辟步调

添加依靠

在进行应用开辟之前,开辟者需要打开native工程的src/main/cpp/CMakeLists.txt,在target_link_libraries依靠中添加libace_napi.z.so,libpixelmap_ndk.z.so,libimage_source_ndk.z.so,librawfile.z.so 以及日志依靠libhilog_ndk.z.so。
  1. target_link_libraries(entry PUBLIC libace_napi.z.so libhilog_ndk.z.so libpixelmap_ndk.z.so libimage_source_ndk.z.so librawfile.z.so)
复制代码
添加接口映射

打开src/main/cpp/hello.cpp文件,在Init函数中添加getSyncPixelMap函数接口映射,作用是以同步的方式生成PixelMap,具体代码如下:
  1. EXTERN_C_START
  2. static napi_value Init(napi_env env, napi_value exports)
  3. {
  4.     napi_property_descriptor desc[] = {
  5.         { "getSyncPixelMap", nullptr, getSyncPixelMap, nullptr, nullptr, nullptr, napi_default, nullptr },
  6.     };
  7.     napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
  8.     return exports;
  9. }
  10. EXTERN_C_END
复制代码
JS侧调用


  • 打开src\main\cpp\types\libentry\index.d.ts(其中libentry根据工程名生成),导入如下引用文件:
  1. import { image } from '@kit.ImageKit';
  2. import { resourceManager } from '@kit.LocalizationKit';
  3. // 同步调用,入参为资源管理器和图片资源名称,返回PixelMap
  4. export const getSyncPixelMap: (resMgr: resourceManager.ResourceManager, src: string) => image.PixelMap;
复制代码

  • 准备图片资源文件,本示例文件名为example.jpg,导入到src\main\resources\rawfile\ 路径下。
  • 打开src\main\ets\pages\index.ets,导入"libentry.so(根据工程名生成)",调用Native接口,传入JS的资源对象。示比方下:
  1. import testNapi from 'libentry.so'
  2. import { image } from '@kit.ImageKit';
  3. @Entry
  4. @Component
  5. struct Index {
  6.   @State pixelMap : PixelMap | undefined = undefined;
  7.   aboutToAppear() {
  8.      // 调用自定义的getSyncPixelMap接口,获取pixelMap
  9.      this.pixelMap = testNapi.getSyncPixelMap(getContext(this).resourceManager, "example.jpg")
  10.   }
  11.   build() {
  12.      Row() {
  13.         Column() {
  14.         Image(this.pixelMap)
  15.            .width(100)
  16.            .height(100)
  17.         }
  18.         .width('100%')
  19.      }
  20.      .height('100%')
  21.   }
  22. }
复制代码
Native接口调用

在hello.cpp文件中获取JS的资源对象,并转为Native的资源对象,即可调用Native接口,调用方式示例代码如下:
添加引用文件
  1.    // 引入图片框架、raw文件、raw文件管理和日志打印头文件
  2.    #include <cstdlib>
  3.    #include <cstring>
  4.    #include <multimedia/image_framework/image_source_mdk.h>
  5.    #include <multimedia/image_framework/image_pixel_map_mdk.h>
  6.    #include <rawfile/raw_file.h>
  7.    #include <rawfile/raw_file_manager.h>
  8.    #include <hilog/log.h>
  9.    
  10.    static napi_value getSyncPixelMap(napi_env env, napi_callback_info info)
  11.    {
  12.       size_t argc = 2;
  13.       napi_value args[2] = {nullptr};
  14.       napi_get_cb_info(env, info, &argc, args , nullptr, nullptr);
  15.       
  16.       napi_valuetype srcType;
  17.       napi_typeof(env, args[0], &srcType);
  18.       // 入参args[0]是资源管理器,用来初始化native层的资源管理器
  19.       NativeResourceManager *mNativeResMgr = OH_ResourceManager_InitNativeResourceManager(env, args[0]);
  20.       
  21.       size_t strSize;
  22.       char srcBuf[2048];
  23.       // 入参args[1]是文件名称
  24.       napi_get_value_string_utf8(env, args[1], srcBuf, sizeof(srcBuf), &strSize);
  25.       // 用资源管理器打开Raw文件
  26.       RawFile * rawFile = OH_ResourceManager_OpenRawFile(mNativeResMgr, srcBuf);
  27.       if (rawFile != NULL) {
  28.          // 获取文件大小,并读取数据
  29.          long len = OH_ResourceManager_GetRawFileSize(rawFile);
  30.          uint8_t * data = static_cast<uint8_t *>(malloc(len));
  31.          int res = OH_ResourceManager_ReadRawFile(rawFile, data, len);
  32.          OhosImageSource imageSource_c;
  33.          imageSource_c.buffer = data;
  34.          imageSource_c.bufferSize = len;
  35.          OhosImageSourceOps ops{};
  36.          napi_value imageSource;
  37.          napi_value pixelMap;
  38.          // 用读取到的Raw数据创建ImageSource
  39.          int32_t ret = OH_ImageSource_Create(env, &imageSource_c, &ops, &imageSource);
  40.          // 初始化native层的ImageSource
  41.          ImageSourceNative * imageSourceNative_c = OH_ImageSource_InitNative(env, imageSource);
  42.          OhosImageDecodingOps decodingOps{};
  43.          // 创建pixelMap
  44.          OH_ImageSource_CreatePixelMap(imageSourceNative_c, &decodingOps, &pixelMap);
  45.          // 下列方法,为gif等动图格式提供。
  46.          // napi_value pixelMapList;
  47.          // OH_ImageSource_CreatePixelMapList(imageSourceNative_c, &decodingOps, &pixelMapList);
  48.          // OhosImageSourceDelayTimeList list{};
  49.          // OH_ImageSource_GetDelayTime(imageSourceNative_c, &list);
  50.          // uint32_t count;
  51.          // OH_ImageSource_GetFrameCount(imageSourceNative_c, &count);
  52.          OhosImageSourceInfo info{};
  53.          // 读取图片宽高
  54.          OH_ImageSource_GetImageInfo(imageSourceNative_c, 0, &info);
  55.          OH_LOG_Print(LOG_APP, LOG_INFO, 0xFF00, "[decode]", "imageInfo width:%{public}d , height:%{public}d", info.size.width, info.size.height);
  56.          
  57.          // 读取图片源的ImageWidth配置参数并打印日志
  58.          OhosImageSourceProperty target;
  59.          char exifKey_c[] = "ImageWidth";
  60.          target.size = strlen(exifKey_c);
  61.          target.value = exifKey_c;
  62.          OhosImageSourceProperty response{};
  63.          response.size = 20;
  64.          response.value = static_cast<char *>(malloc(20));
  65.          OH_ImageSource_GetImageProperty(imageSourceNative_c, &target, &response);
  66.          OH_LOG_Print(LOG_APP, LOG_INFO, 0xFF00, "[decode]", "ImageProperty width after modify:%{public}s", response.value);
  67.          // 处理完毕,释放native层资源
  68.          OH_ImageSource_Release(imageSourceNative_c);
  69.          OH_ResourceManager_CloseRawFile(rawFile);
  70.          return pixelMap;
  71.       }
  72.       OH_ResourceManager_ReleaseNativeResourceManager(mNativeResMgr);
  73.       return nullptr;
  74.    }
复制代码
图片框架支持增量式解码,使用方法如下:
  1.    // 引入图片框架、raw文件、raw文件管理和日志打印头文件
  2.    #include <cstdlib>
  3.    #include <cstring>
  4.    #include <multimedia/image_framework/image_source_mdk.h>
  5.    #include <multimedia/image_framework/image_pixel_map_mdk.h>
  6.    #include <rawfile/raw_file.h>
  7.    #include <rawfile/raw_file_manager.h>
  8.    #include <hilog/log.h>
  9.    
  10.    static napi_value getSyncPixelMap(napi_env env, napi_callback_info info)
  11.    {
  12.       size_t argc = 2;
  13.       napi_value args[2] = {nullptr};
  14.       napi_get_cb_info(env, info, &argc, args , nullptr, nullptr);
  15.       
  16.       napi_valuetype srcType;
  17.       napi_typeof(env, args[0], &srcType);
  18.       // 入参args[0]是资源管理器,用来初始化native层的资源管理器
  19.       NativeResourceManager * mNativeResMgr = OH_ResourceManager_InitNativeResourceManager(env, args[0]);
  20.       
  21.       size_t strSize;
  22.       char srcBuf[2048];
  23.       // 入参args[1]是文件名称
  24.       napi_get_value_string_utf8(env, args[1], srcBuf, sizeof(srcBuf), &strSize);
  25.       // 用资源管理器打开Raw文件
  26.       RawFile * rawFile = OH_ResourceManager_OpenRawFile(mNativeResMgr, srcBuf);
  27.       if (rawFile != NULL) {
  28.          // 获取文件大小,若大于2048字节,则增量式解码,否则直接全部解码
  29.          long len = OH_ResourceManager_GetRawFileSize(rawFile);
  30.          if (len > 2048) {
  31.             uint8_t * data = static_cast<uint8_t *>(malloc(len));
  32.             // 读取文件全部数据
  33.             int res = OH_ResourceManager_ReadRawFile(rawFile, data, len);
  34.             
  35.             uint8_t * holderdata = static_cast<uint8_t *>(malloc(len));
  36.             OhosImageSource imageSource_c;
  37.             // imageSource_c的buffer分配了空间,但是数据是空的
  38.             imageSource_c.buffer = holderdata;
  39.             imageSource_c.bufferSize = len;
  40.             OhosImageSourceOps ops{};
  41.             napi_value imageSource;
  42.             // 初始化增量ImageSource
  43.             OH_ImageSource_CreateIncremental(env, &imageSource_c, &ops, &imageSource);
  44.             // 初始化native层的ImageSource
  45.             ImageSourceNative * imageSourceNative_c = OH_ImageSource_InitNative(env, imageSource);
  46.             // 以下模拟分片加载场景,分两次加载分片。第一次加载2048字节,第二次加载剩余的数据。
  47.             OhosImageSourceUpdateData firstData{};
  48.             firstData.buffer = data; // 图片数据
  49.             firstData.bufferSize = len; // 图片数据总大小
  50.             firstData.isCompleted = false;
  51.             firstData.offset = 0; // 第一次重头开始加载
  52.             firstData.updateLength = 2048; // 第一次加载了2048字节
  53.             OH_ImageSource_UpdateData(imageSourceNative_c, &firstData);
  54.             OhosImageSourceUpdateData secondData{};
  55.             secondData.buffer = data;
  56.             secondData.bufferSize = len;
  57.             secondData.isCompleted = true; // 最后一次加载,要标记加载完成
  58.             secondData.offset = 2048; // 已经加载过2048字节了,第二次偏移已经加载的量
  59.             secondData.updateLength = len - 2048; // 第二次加载剩余的数据
  60.             OH_ImageSource_UpdateData(imageSourceNative_c, &secondData);
  61.             napi_value pixelMap;
  62.             OhosImageDecodingOps decodingOps{};
  63.             decodingOps.index = 0;
  64.             // 创建pixelMap
  65.             OH_ImageSource_CreatePixelMap(imageSourceNative_c, &decodingOps, &pixelMap);
  66.             // 处理完毕,释放native层资源
  67.             OH_ImageSource_Release(imageSourceNative_c);
  68.             OH_ResourceManager_CloseRawFile(rawFile);
  69.             return pixelMap;
  70.          }
  71.          // 读取Raw文件全部数据
  72.          uint8_t * data = static_cast<uint8_t *>(malloc(len));
  73.          int res = OH_ResourceManager_ReadRawFile(rawFile, data, len);
  74.          OhosImageSource imageSource_c;
  75.          imageSource_c.buffer = data;
  76.          imageSource_c.bufferSize = len;
  77.          OhosImageSourceOps ops{};
  78.          napi_value imageSource;
  79.          napi_value pixelMap;
  80.          // 用读取到的Raw数据创建ImageSource
  81.          int32_t ret = OH_ImageSource_Create(env, &imageSource_c, &ops, &imageSource);
  82.          // 初始化native层的ImageSource
  83.          ImageSourceNative * imageSourceNative_c = OH_ImageSource_InitNative(env, imageSource);
  84.          OhosImageDecodingOps decodingOps{};
  85.          // 创建pixelMap
  86.          OH_ImageSource_CreatePixelMap(imageSourceNative_c, &decodingOps, &pixelMap);
  87.          // 处理完毕,释放native层资源
  88.          OH_ImageSource_Release(imageSourceNative_c);
  89.          OH_ResourceManager_CloseRawFile(rawFile);
  90.          return pixelMap;
  91.       }
  92.       OH_ResourceManager_ReleaseNativeResourceManager(mNativeResMgr);
  93.       return nullptr;
  94.    }
复制代码
最后呢

很多开辟朋友不知道需要学习那些鸿蒙技术?鸿蒙开辟岗位需要掌握那些核心技术点?为此鸿蒙的开辟学习必须要体系性的进行。
而网上有关鸿蒙的开辟资料非常的少,假如你想学好鸿蒙的应用开辟与体系底层开辟。你可以参考这份资料,少走很多弯路,节省没必要的贫困。由两位前阿里高级研发工程师联合打造的《鸿蒙NEXT星河版OpenHarmony开辟文档》里面内容包罗了(ArkTS、ArkUI开辟组件、Stage模型、多端部署、分布式应用开辟、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、Harmony南向开辟、鸿蒙项目实战等等)鸿蒙(Harmony NEXT)技术知识点
假如你是一名Android、Java、前端等等开辟人员,想要转入鸿蒙方向发展。可以直接领取这份资料辅助你的学习。下面是鸿蒙开辟的学习路线图。

针对鸿蒙成长路线打造的鸿蒙学习文档。话不多说,我们直接看具体鸿蒙(OpenHarmony )手册(共计1236页)与鸿蒙(OpenHarmony )开辟入门视频,帮助大家在技术的门路上更进一步。


  • 《鸿蒙 (OpenHarmony)开辟学习视频》
  • 《鸿蒙生态应用开辟V2.0白皮书》
  • 《鸿蒙 (OpenHarmony)开辟基础到实战手册》
  • OpenHarmony北向、南向开辟环境搭建
  • 《鸿蒙开辟基础》
  • 《鸿蒙开辟进阶》
  • 《鸿蒙开辟实战》

总结

鸿蒙—作为国家主力推送的国产操作体系。部分的高校已经取消了安卓课程,从而开设鸿蒙课程;企业纷纷跟进启动了鸿蒙研发。
而且鸿蒙是完全具备无与伦比的机遇和潜力的;预计到年底将有 5,000 款的应用完成原生鸿蒙开辟,未来将会支持 50 万款的应用。那么这么多的应用需要开辟,也就意味着需要有更多的鸿蒙人才。鸿蒙开辟工程师也将会迎来发作式的增长,学习鸿蒙势在必行! 自↓↓↓拿


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

商道如狼道

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表