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.so。 16 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.cpp或napi_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