使用libexif开源库修改jpeg相片exif信息

  • libexif简介
  • 一、读exif信息
  • 二、写exif信息
    • 说明
    • 例:修改exif中GPS海拔高度

libexif简介

libexif是一个开源的图片exif信息操作库,提供了对exif信息常见操作接口;
exif则是相片中的附属信息,常见的exif信息如图:

一、读exif信息

使用libexif对exif信息进行遍历,参考:https://blog.csdn.net/ibingow/article/details/7724453

二、写exif信息

说明

写exif的代码参考stackoverflow一位大佬的代码:

  • 原帖
  • github

他的代码使用了libjpeg、libexif两个库,多封装了一些接口,可以直接设置一些exif信息,都在JpegEncoderEXIF.c

例:修改exif中GPS海拔高度

上述代码中,没有提供直接修改exif的接口,下面是修改海拔高度的demo,最终效果:

实现代码(Linux C):

//linux eclipse环境
#include <stdio.h>
#include <stdlib.h>
#include <libexif/exif-data.h>
#include <libjpeg/jpeg-data.h>
#include <JpegEncoderEXIF/JpegEncoderEXIF.h>/** create_tag() is from the write-exif.c sample code that is floating* around the interweb - with thanks to whoever created it!*//* Create a brand-new tag with a data field of the given length, in the* given IFD. This is needed when exif_entry_initialize() isn't able to create* this type of tag itself, or the default data length it creates isn't the* correct length.*/
static ExifEntry *create_tag(ExifData *exif, ExifIfd ifd, ExifTag tag, size_t len)
{void *buf;ExifEntry *entry;/* Create a memory allocator to manage this ExifEntry */ExifMem *mem = exif_mem_new_default();/* Create a new ExifEntry using our allocator */entry = exif_entry_new_mem (mem);/* Allocate memory to use for holding the tag data */buf = exif_mem_alloc(mem, len);/* Fill in the entry */entry->data = buf;entry->size = len;entry->tag = tag;entry->components = len;entry->format = EXIF_FORMAT_UNDEFINED;/* Attach the ExifEntry to an IFD */exif_content_add_entry (exif->ifd[ifd], entry);/* The ExifMem and ExifEntry are now owned elsewhere */exif_mem_unref(mem);exif_entry_unref(entry);return entry;
}int main(int argc, char *argv[])
{if(argc < 3){fprintf(stderr, "Usage: %s <src.jpg> <out.jpg>\n", argv[0]);return -1;}//1.获取jpeg、exif数据JPEGData *pJpegData = jpeg_data_new_from_file(argv[1]);if(!pJpegData){printf("jpeg_data_new_from_file err\n");return -1;}ExifData *pExifData = jpeg_data_get_exif_data(pJpegData);if(!pExifData){printf("jpeg_data_get_exif_data err\n");return -1;}//2.获取对应的entryprintf("Now to get entry!************************************\n");//获取GPS海拔信息的entryExifEntry *pExifEntry = exif_content_get_entry(pExifData->ifd[EXIF_IFD_GPS], EXIF_TAG_GPS_ALTITUDE);if(!pExifEntry){printf("exif_content_get_entry err\n");printf("No EXIF_TAG_GPS_ALTITUDE_REF info!\n");return -1;}char value_array[1024];printf("EXIF_TAG_GPS_LATITUDE: %s\n", exif_entry_get_value(pExifEntry, value_array, sizeof(value_array)));ExifByteOrder byte_order = exif_data_get_byte_order(pExifData);//获取图片的字节序ExifRational altitude = {.denominator = 10,//分母.numerator = 666//分子//最终写入海拔:666/10 = 66.6m};exif_set_rational(pExifEntry->data, byte_order, altitude);//写入exif到jpegjpeg_data_set_exif_data(pJpegData, pExifData);//jpeg另存为if(0 == jpeg_data_save_file(pJpegData, argv[2])){printf("jpeg_data_save_file error!\n");return -1;}return 0;
}

使用libexif开源库修改jpeg相片exif信息相关推荐

  1. java根据exif旋转,关于图片文件旋转JPEG与EXIF信息

    关于图片文件旋转JPEG与EXIF信息 2019/10/31 0:36:39  YuLimin  程序员俱乐部  我要评论(1) 摘要:关于图片文件旋转JPEG与EXIF信息比如某相机拍摄出来的相片, ...

  2. 关于图片文件旋转JPEG与EXIF信息

    关于图片文件旋转JPEG与EXIF信息 比如某相机拍摄出来的相片,文件分辨率比如宽度7360像素,高度4912像素 十进制表示为 DEC : 7360 * 4912 十六进制则为 HEX : 1CC0 ...

  3. 隐藏表白技能,python教你如何使用图片exif信息隐藏表白,教你如何修改,查询exif信息。

    " 隐藏表白技能" 你有想过一张图片所包含的信息吗?你有想过一张图片可以为你隐藏表达一些内容吗?你有想过图片的隐藏信息可以为你表达你想要说明的东西吗?以及你可以 用图片去表达你的爱 ...

  4. MATLAB批量读取航摄相片EXIF信息和GNSS信息以及MATLAB批量经纬度坐标转换空间直角坐标

    前言 没有前言,创作不易,希望家人们点点赞,如有错误评论留言,感谢支持! 文章目录 前言 一.MATLAB批量读取航摄相片的EXIF信息,并批量提取其GNSS经纬度信息 (1)前述: (2)代码实现和 ...

  5. python批量修改图片的exif信息,增加GPS信息。

      有时候需要给图片增加地理信息,比如在用无人机影像做3维建模或者正射影像时,可以将无人机的gps写入图片,然后用ODM快速完成三维模型与正射影像生成.   ODM的使用方法可以参看下面这篇博客. h ...

  6. 使用imageIO获取和修改图片的exif信息

    看到这篇文章.喜欢的不得了-转来分享给大家! 一幅图片除了包含我们能看见的像素信息,背后还包含了拍摄时间,光圈大小,曝光等信息.UIImage类将这些细节信息都隐藏了起来,只提供我们关心的图片尺寸,图 ...

  7. java 修改exif_照片EXIF信息的读取和改写的JAVA实现

    由于项目需要对照片的EXIF信息进行处理,因此在网上搜索了一番.捣鼓出来了,写下,总结. 需要用到2个jar包,metadata-extractor-2.3.1和mediautil-1.0.这2个ja ...

  8. jquery exif + lazyload实现延迟加载并显示相片exif信息

    2019独角兽企业重金招聘Python工程师标准>>> 对一个摄影爱好者来说,从高手的作品中学习是非常有用的.而照片的光圈,快门,感光度等信息是关注的重点. 上代码: 1 <s ...

  9. 图片修改大小保存EXIF信息

    最近遇到一个问题:无人机遥感图像拼接.图像拼接技术很成熟了,所以一直认为图像之间只要有重叠就能一张张很容易拼成一幅大图,结果实际操作的时候并没有那么简单. 首先第一个问题就是图像太大,太多,拼接起来简 ...

最新文章

  1. Redis (二)_ jedis的使用
  2. excel 进行二叉树_基础扩展 | 21. 遍历二叉树
  3. NLP:基于textrank4zh库对文本实现提取文本关键词、文本关键短语和文本摘要
  4. 小米平板2更新bios版本_【军团战争5.25】新版本更新预告第一弹,2级兵3次升级!...
  5. Python打牢基础,从12个语法开始!
  6. Linux编程练习 --多线程5--信号量(semaphore)
  7. vue函数input输入值即请求,优化为用户输入完成之后再请求
  8. do case php,PHP 规范之编程规范
  9. devexpress 打印一个form界面_通过回车键提交form表单时,你是否注意过这些问题?...
  10. CSS3渐变——线性渐变
  11. java常用的网关有哪几种_拼多多java开发一面、二面合并面经
  12. openCV播放视频的程序
  13. 为帮助建筑和设施管理者满足保持社交距离的需求,Bentley 软件公司开放对 LEGION Simulator 和 OpenBuildings Station Designer 的完全访问权限,并在
  14. 冷热水龙头_冷热水龙头原理是什么 冷热水龙头原理及结构图
  15. 使用Sinc卷积从原始音频数据进行轻量级的端到端语音识别
  16. JetBrains又出编程神器!
  17. html 实现模糊效果
  18. 武侠小说中绝顶高手生存指南
  19. Educoder_Web_简历表页面的制作
  20. 呼叫中心电话客服系统搭建的种类除了OKCC外还有哪些?

热门文章

  1. Unity非常简单的翻牌游戏教程,纯UI实现
  2. 汇编学习---循环结构程序设计
  3. The 2018 ICPC Asia-East Continent Final E(dp)
  4. 使用Cheat Enginee(CE)找出“雷数”、“笑脸”和“计时器”
  5. 浪潮服务器2016销售额,Gartner:2016前三季度,浪潮服务器销售额中国第一
  6. Ubuntu 18.04 重置网络与配置网路(虚拟机网络丢失问题)
  7. cmake error: Could NOT find CUDA-unsuitable version “8.0”,but required is exact version “9.0”
  8. 如何在电脑上安装 Windows 版桌面编辑器 v7.3
  9. Unity 获取到Camera的cullingMask,包含多个选择
  10. 永中office之在线编辑(java版)