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