• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 使用Image_NativeModule编辑图片EXIF信息
2
3Image Kit提供图片EXIF信息的读取与编辑能力。
4
5EXIF(Exchangeable image file format)是专门为数码相机的照片设定的文件格式,可以记录数码照片的属性信息和拍摄数据。当前仅支持JPEG格式图片。
6
7在图库等应用中,需要查看或修改数码照片的EXIF信息。由于摄像机的手动镜头参数无法自动写入到EXIF信息中或者因为相机断电等原因会导致拍摄时间出错,这时需要手动修改错误的EXIF数据,即可使用本功能。
8
9OpenHarmony目前仅支持对部分EXIF信息的查看和修改,具体支持的范围请参见:[OHOS_IMAGE_PROPERTY_XXX](../../reference/apis-image-kit/_image___native_module.md#变量)。
10
11## 开发步骤
12
13### 添加链接库
14
15在进行应用开发之前,开发者需要打开native工程的src/main/cpp/CMakeLists.txt,在target_link_libraries依赖中添加libimage_source.so 以及日志依赖libhilog_ndk.z.so16
17```txt
18target_link_libraries(entry PUBLIC libhilog_ndk.z.so libimage_source.so)
19```
20
21### Native接口调用
22
23EXIF信息的读取与编辑相关C API接口的详细介绍请参见[OH_ImageSource_GetImageProperty](../../reference/apis-image-kit/_image___native_module.md#oh_imagesourcenative_getimageproperty) 和 [OH_ImageSource_ModifyImageProperty](../../reference/apis-image-kit/_image___native_module.md#oh_imagesourcenative_modifyimageproperty)。
24
25在Deveco Studio新建Native C++应用,默认生成的项目中包含index.ets文件,在entry\src\main\cpp目录下会自动生成一个cpp文件(hello.cppnapi_init.cpp,本示例以hello.cpp文件名为例)。在hello.cpp中实现C API接口调用逻辑,示例代码如下:
26
27**读取和编辑图片EXIF信息接口使用示例**
28
29在创建ImageSource实例后,读取、编辑EXIF信息。
30
31   ```c++
32
33      #include <linux/kd.h>
34      #include <string>
35
36      #include <hilog/log.h>
37      #include <multimedia/image_framework/image/image_source_native.h>
38
39      #undef LOG_DOMAIN
40      #undef LOG_TAG
41      #define LOG_DOMAIN 0x3200
42      #define LOG_TAG "MY_TAG"
43
44      #define NUM_0 0
45      #define NUM_1 1
46
47      // 处理napi返回值。
48      napi_value getJsResult(napi_env env, int result) {
49          napi_value resultNapi = nullptr;
50          napi_create_int32(env, result, &resultNapi);
51          return resultNapi;
52      }
53
54      static napi_value exifTest(napi_env env, napi_callback_info info)
55      {
56          napi_value argValue[NUM_1] = {0};
57          size_t argCount = NUM_1;
58          if (napi_get_cb_info(env, info, &argCount, argValue, nullptr, nullptr) != napi_ok || argCount < NUM_1 ||
59              argValue[NUM_0] == nullptr) {
60              OH_LOG_ERROR(LOG_APP, "ImageSourceNativeCTest exifTest napi_get_cb_info failed, argCount: %{public}d.", argCount);
61              return getJsResult(env, IMAGE_BAD_PARAMETER);
62          }
63          char name[1024];
64          size_t nameSize = 1024;
65          napi_get_value_string_utf8(env, argValue[NUM_0], name, 1024, &nameSize);
66
67          //创建ImageSource实例。
68          OH_ImageSourceNative *source = nullptr;
69          Image_ErrorCode errCode = OH_ImageSourceNative_CreateFromUri(name, nameSize, &source);
70          if (errCode != IMAGE_SUCCESS) {
71              OH_LOG_ERROR(LOG_APP, "ImageSourceNativeCTest exifTest OH_ImageSourceNative_CreateFromUri failed, errCode: %{public}d.", errCode);
72              return getJsResult(env, errCode);
73          }
74
75          // 读取EXIF信息,OHOS_IMAGE_PROPERTY_BITS_PER_SAMPLE为每个像素比特数。
76          Image_String getKey;
77          const std::string PIXEL_X_DIMENSION = OHOS_IMAGE_PROPERTY_BITS_PER_SAMPLE;
78          getKey.data = (char *)PIXEL_X_DIMENSION.c_str();
79          getKey.size = PIXEL_X_DIMENSION.length();
80          Image_String getValue;
81          errCode = OH_ImageSourceNative_GetImageProperty(source, &getKey, &getValue);
82          if (errCode != IMAGE_SUCCESS) {
83              OH_LOG_ERROR(LOG_APP, "ImageSourceNativeCTest exifTest OH_ImageSourceNative_GetImageProperty failed, errCode: %{public}d.", errCode);
84              return getJsResult(env, errCode);
85          }
86
87          // 编辑EXIF信息,OHOS_IMAGE_PROPERTY_ORIENTATION为图片方向。
88          Image_String setKey;
89          const std::string ORIENTATION = OHOS_IMAGE_PROPERTY_ORIENTATION;
90          setKey.data = (char *)ORIENTATION.c_str();
91          setKey.size = ORIENTATION.length();
92          Image_String setValue;
93          setValue.data = (char *)"4";
94          setValue.size = 1;
95          errCode = OH_ImageSourceNative_ModifyImageProperty(source, &setKey, &setValue);
96          if (errCode != IMAGE_SUCCESS) {
97              OH_LOG_ERROR(LOG_APP, "ImageSourceNativeCTest exifTest OH_ImageSourceNative_ModifyImageProperty failed, errCode: %{public}d.", errCode);
98              return getJsResult(env, errCode);
99          }
100
101          //释放ImageSource实例。
102          OH_ImageSourceNative_Release(source);
103          OH_LOG_INFO(LOG_APP, "ImageSourceNativeCTest exifTest success.");
104          return getJsResult(env, IMAGE_SUCCESS);
105      }
106   ```
107