海思3519DV500使用libexif

一、交叉编译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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱爬山的木木

佛系111

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值