最近,项目需要使用jpg图像信息被写入(非水印),经过研究发现,Android已封装的读者jpg图片扩展信息api(ExifInterface)。

通讯api住址:http://developer.android.com/reference/android/media/ExifInterface.html

读写均是键值对的方式,须要注意的是值的类型须要严格依照api定义格式。

支持读写节点为:

1.TAG_APERTURE:光圈

2.TAG_DATETIME:日期时间

类型:String,格式为:“yyyy-MM-dd HH:mm:ss”

3.TAG_EXPOSURE_TIME:曝光时刻

4.TAG_FLASH:是否开启闪光灯

5.TAG_FOCAL_LENGTH:焦距

6.TAG_GPS_ALTITUDE:高度

官方释义:The altitude (in meters) based on the reference in TAG_GPS_ALTITUDE_REF. Type is rational.

官方解释类型为有理数。个人理解应为double类型的正数(正整数和正分数)。

7.TAG_GPS_ALTITUDE_REF:高度參考(海平面以上还是海平面下面)

类型:int,0为海平面以上,1为海平面下面。

8.TAG_GPS_DATESTAMP:日期戳

9.TAG_GPS_LATITUDE:纬度

类型:String,格式:Format is "num1/denom1,num2/denom2,num3/denom3".(即度分秒格式)。android.location.Location.getLatitude()获取到的纬度信息须要转换后才干写到此节点下。转换方法在下边列出。

10. TAG_GPS_LATITUDE_REF:纬度參考(南纬、北纬)

11.TAG_GPS_LONGITUDE:经度

同纬度。

12. TAG_GPS_LONGITUDE:经度參考(东经、西经)

13.TAG_GPS_TIMESTAMP:时间戳

14.TAG_IMAGE_LENGTH:图片高度

15.TAG_IMAGE_WIDTH:图片宽度

16.TAG_ISO:曝光度

17.TAG_MAKE:设备制造商

18.TAG_MODEL:设备型号

19.TAG_ORIENTATION:方向

20.TAG_WHITE_BALANCE:白平衡

以写入与读取经纬度信息为例介绍Android ExifInterface读写jpg exif信息:

//Gps纬度
double lat = GpsTracking.bestLocation.getLatitude();
//Gps经度
double lon = GpsTracking.bestLocation.getLongitude();
try {
//获取jpg文件
ExifInterface exif = new ExifInterface(filePath + "/" +filename);
//写入纬度信息
exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE, gpsInfoConvert(lat));
exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE_REF,
lat > 0 ?"N" : "S");
//写入经度信息
exif.setAttribute(ExifInterface.TAG_GPS_LONGITUDE, gpsInfoConvert(lon));
exif.setAttribute(ExifInterface.TAG_GPS_LONGITUDE_REF,
lon > 0 ?"E" : "W");
//这句话非常重要。一定要saveAttributes才干使写入的信息生效。 exif.saveAttributes();
//获取纬度信息
String latitude = exif.getAttribute(ExifInterface.TAG_GPS_LATITUDE);
//获取经度信息
String longitude = exif.getAttribute(ExifInterface.TAG_GPS_LONGITUDE);
} catch (IOException e) {
e.printStackTrace();
}
private String gpsInfoConvert(double gpsInfo){
gpsInfo = Math.abs(gpsInfo);
String dms = Location.convert(gpsInfo, Location.FORMAT_SECONDS);
String[] splits = dms.split(":");
String[] secnds = (splits[2]).split("\\.");
String seconds;
if (secnds.length == 0) {
seconds = splits[2];
} else {
seconds = secnds[0];
}
return splits[0] + "/1," + splits[1] + "/1," + seconds + "/1";
}

疑问:

官方api:

public boolean getLatLong (float[] output)



释义:Stores the latitude and longitude value in a float array. The first element is the latitude, and the second element is the longitude. Returns false if the Exif tags are not available.

此方法是以浮点型数组来存储经纬度信息的,详细存储到哪个节点有待考证,假设是自己主动存储到TAG_GPS_LATITUDE和TAG_GPS_LONGITUDE节点的话,那么前边的转换方法就能够省掉了。有兴趣的朋友能够考呵呵证书。

版权声明:本文博主原创文章。博客,未经同意不得转载。

JPEG图像扩展信息读取和修改的更多相关文章

  1. JPEG图片扩展信息读取与修改

    extends:http://www.2cto.com/kf/201405/303813.html 读写均是键值对的方式,需要注意的是值的类型需要严格按照api定义格式. 支持读写节点为: 1.TAG ...

  2. JPEG图片扩展信息读取与改动

    近日项目中须要用到往jpg图片中写入信息(非水印),经调研发现Android中已经封装了读写jpg图片扩展信息的api(ExifInterface). 相应api地址:http://developer ...

  3. MP3 信息读取

    MP3 信息读取 运行环境:Window7 64bit,.NetFramework4.61,C# 7.0: 编者:乌龙哈里 2017-03-13 参考: MP3-wikipedia ID3v1 MPE ...

  4. 【原创】JPEG图像密写研究(三) 数据流译码

    [原创]这次更新比较慢,译码过程比想象中复杂一些,更主要是译出来的DCT系数无法确定是否正确,要想验证就需要再进行正向压缩编码,再次形成jpeg图像验证正确,后续工作正在开展,这里就说一说译码的主要思 ...

  5. C# 配置文件读取与修改

    C# 配置文件读取与修改   配置文件在很多情况下都使用到, 配置文件分为两种 一种是应用程序的配置文件, 一种是web的配置文件. 两种配置文件最大的区别是web的配置文件更新之后会实时更新, 应用 ...

  6. C# 配置文件读取与修改(转)

    C# 配置文件读取与修改   配置文件在很多情况下都使用到, 配置文件分为两种 一种是应用程序的配置文件, 一种是web的配置文件. 两种配置文件最大的区别是web的配置文件更新之后会实时更新, 应用 ...

  7. JPEG图像密写研究(一) JPEG图像文件结构

    [转载]转载自http://www.cnblogs.com/leaven/archive/2010/04/06/1705846.html JPEG压缩编码算法的主要计算步骤如下: (0) 8*8分块. ...

  8. 【原创】JPEG图像密写研究(二) 哈夫曼树的建立

    [原创]记录自己研究的过程,仅供参考,欢迎讨论... 在根据JPEG图像文件结构读取完文件后,提取出其中DHT段,利用其中内容建立哈夫曼树,便于之后译码工作.这里需要注意的是文件中的哈夫曼表数量不固定 ...

  9. Linux PCI/PCI-E设备配置空间读取与修改

    Linux PCI/PCI-E设备配置空间读取与修改 1 前言 PCI和PCI Express,是计算机常使用的一种高速总线.操作系统中的PCI/PCI-E设备驱动以及操作系统内核,都需要访问PCI及 ...

随机推荐

  1. ubuntu, 修改hosts文件

    介绍下ubuntu下修改host实现域名指向本地的方法. Ubuntu系统的Hosts只需修改/etc/hosts文件,在目录中还有一个hosts.conf文件,刚开始还以为只需要修改这个就可以了,结 ...

  2. QWaitCondition 的正确使用方法(通过 mutex 把有严格时序要求的代码保护起来,同时把 wakeAll() 也用同一个 mutex 保护起来)

    简单用法 QWaitCondition 用于多线程的同步,一个线程调用QWaitCondition::wait() 阻塞等待,直到另一个线程调用QWaitCondition::wake() 唤醒才继续 ...

  3. LDD3之并发和竞态-completion(完毕量)的学习和验证

    LDD3之并发和竞态-completion(完毕量)的学习和验证 首先说下測试环境: Linux2.6.32.2 Mini2440开发板 一開始难以理解书上的书面语言,这里<linux中同步样例 ...

  4. js课程 2-8 js内置对象有哪些

    js课程 2-8 js内置对象有哪些 一.总结 一句话总结:JS中内置了17个对象,常用的是Array对象.Date对象.正则表达式对象.string对象.Global对象. 1.js常用对象有哪些? ...

  5. css3-12 transform:scale(1.2,1.2)实现移入元素变大特效

    css3-12 transform:scale(1.2,1.2)实现移入元素变大特效 一.总结 一句话总结:transform:scale(1.2,1.2)鼠标移入的时候变大一点点,超出边框的部分隐藏 ...

  6. Latex表格制作记录

    Latex表格制作记录 主要功能 合并表格的行列 长表格的使用 makecell例程借鉴 效果图 参考代码 \documentclass{ctexart} \usepackage{indentfirs ...

  7. angular组件间的信息传递

    原文 https://www.jianshu.com/p/82207f2249c1 大纲 1.父组件向子组件传递信息:通过属性 2.子组件向父组件传递信息:通过事件 3.父组件获取子组件的信息:通过调 ...

  8. [Angular] Configurable NgModules

    You probably have seen 'foorRoot()' method a lot inside Angular application. Creating a configurable ...

  9. 【Lucene4.8教程之三】搜索 2014-06-21 09:53 1532人阅读 评论(0) 收藏

    1.关键类 Lucene的搜索过程中涉及的主要类有以下几个: (1)IndexSearcher:执行search()方法的类 (2)IndexReader:对索引文件进行读操作,并为IndexSear ...

  10. NET WinForm 开发所见即所得的 IDE 开发环境

    Github 开源:使用 .NET WinForm 开发所见即所得的 IDE 开发环境(Sheng.Winform.IDE)[2.源代码简要说明]   GitHub:https://github.co ...