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