一、交叉编译libexif
1.下载代码与编译
git clone https://github.com/libexif/libexif.git ##整个地方建议用release版本
cd libexif
mkdir install
./configure --prefix=${PWD}/install --enable-shared --enable-static CC=aarch64-v01c01-linux-gnu-gcc --host=aarch64-v01c01-linux-gnu
make
make install
2.编译完成
/home/ll/code/libexif/
├── include
│ └── libexif
│ ├── exif-byte-order.h
│ ├── exif-content.h
│ ├── exif-data.h
│ ├── exif-data-type.h
│ ├── exif-entry.h
│ ├── exif-format.h
│ ├── exif-ifd.h
│ ├── exif-loader.h
│ ├── exif-log.h
│ ├── exif-mem.h
│ ├── exif-mnote-data.h
│ ├── exif-tag.h
│ ├── exif-utils.h
│ └── _stdint.h
└── lib
└── libexif.a
二、基础写exif
1.生成exif参数
封装简单接口,获取JPG图片的exif的内存数据,主要是ISO exp,ev,代码可以参考 libexif/contrib/examples/write-exif.c
int GetExifData(char* exifdata, int* exiflen, int iso, int exp, int ev)
{
ExifEntry* entry;
ExifData* exif = exif_data_new();
exif_data_set_option(exif, EXIF_DATA_OPTION_FOLLOW_SPECIFICATION);
exif_data_set_data_type(exif, EXIF_DATA_TYPE_COMPRESSED);
exif_data_set_byte_order(exif, FILE_BYTE_ORDER);
//曝光时间设置 uint:s
ExifRational exposure_time; //曝光时间
exposure_time.numerator = 1;
exposure_time.denominator = exp;
entry = init_tag(exif, EXIF_IFD_EXIF, EXIF_TAG_EXPOSURE_TIME);
exif_set_rational(entry->data, FILE_BYTE_ORDER, exposure_time);
//ISO 大小
entry = init_tag(exif, EXIF_IFD_EXIF, EXIF_TAG_ISO_SPEED_RATINGS);
exif_set_short(entry->data, FILE_BYTE_ORDER, iso);
//曝光补偿 unit EV
ExifSRational exposure_bias_value;
exposure_bias_value.numerator = 0;
exposure_bias_value.denominator = ev;
entry = init_tag(exif, EXIF_IFD_EXIF, EXIF_TAG_EXPOSURE_BIAS_VALUE);
exif_set_srational(entry->data, FILE_BYTE_ORDER, exposure_bias_value);
unsigned char* exif_data;
unsigned int exif_data_len;
exif_data_save_data(exif, &exif_data, &exif_data_len);
int len = 0;
memcpy(exifdata, exif_header, exif_header_len);
len = exif_header_len;
exifdata[len++] = (exif_data_len + 2) >> 8;
exifdata[len++] = (exif_data_len + 2) & 0xff;
memcpy(exifdata + len, exif_data, exif_data_len);
len += exif_data_len;
*exiflen = len;
return 0;
}
#### 2.把exif信息写道JPG里面
写入海思编码JPG的时候,因为写入exif信息,需要跳过jpg的头,否则jpg图片会没法显示;
jpg头的数据长度是
int jpegdata_offset = (pData[4] << 8) + pData[5] + 4;
//然后写文件:文件数据内容如下
exifdata + jpg data(jpgData需要把前面jpegdata_offset 长度的数据去掉)
2.2 读取exif
按照写入的逻辑 读取即可
int GetFileExif(char* filename, int* iso, int* exp, int* ev)
{
ExifData* ed;
ExifEntry* entry;
ed = exif_data_new_from_file(filename);
if (!ed) {
return -1;
}
entry = exif_content_get_entry(ed->ifd[EXIF_IFD_EXIF], EXIF_TAG_EXPOSURE_TIME);
ExifRational exposure_time = exif_get_rational(entry->data, FILE_BYTE_ORDER);
*exp = 1000 / exposure_time.denominator;
entry = exif_content_get_entry(ed->ifd[EXIF_IFD_EXIF], EXIF_TAG_ISO_SPEED_RATINGS);
*iso = exif_get_short(entry->data, FILE_BYTE_ORDER);
entry = exif_content_get_entry(ed->ifd[EXIF_IFD_EXIF], EXIF_TAG_EXPOSURE_BIAS_VALUE);
ExifRational exposure_bias_value = exif_get_rational(entry->data, FILE_BYTE_ORDER);
*ev = exposure_bias_value.denominator;
return 0;
}