JPEG图片扩展信息读取与修改
2016-03-04 14:21
477 查看
extends:http://www.2cto.com/kf/201405/303813.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信息:
读写均是键值对的方式,需要注意的是值的类型需要严格按照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(); }
/* * TAG_DATETIME 时间日期 * TAG_FLASH 闪光灯 * TAG_GPS_LATITUDE 纬度 * TAG_GPS_LATITUDE_REF 纬度参考 * TAG_GPS_LONGITUDE 经度 * TAG_GPS_LONGITUDE_REF 经度参考 * TAG_IMAGE_LENGTH 图片长 * TAG_IMAGE_WIDTH 图片宽 * TAG_MAKE 设备制造商 * TAG_MODEL 设备型号 * TAG_ORIENTATION 方向 * TAG_WHITE_BALANCE 白平衡 */ public static String readPicturedDate(String photoPath) { try { if (!TextUtils.isEmpty(photoPath)) { ExifInterface exifInterface = new ExifInterface(photoPath); return exifInterface.getAttribute(ExifInterface.TAG_DATETIME); } } catch (Exception e) { e.printStackTrace(); } return new Date().toString(); } public static float[] readPicturedPlace(String photoPath) { float[] location = new float[2]; try { if (!TextUtils.isEmpty(photoPath)) { ExifInterface exifInterface = new ExifInterface(photoPath); location[0] = toLatLng(exifInterface.getAttribute(ExifInterface.TAG_GPS_LATITUDE)); location[1] = toLatLng(exifInterface.getAttribute(ExifInterface.TAG_GPS_LONGITUDE)); return location; } } catch (Exception e) { e.printStackTrace(); } return null; } /** * 读取图片属性:旋转的角度 * * @param path 图片绝对路径 * @return degree旋转的角度 * 在获取Bitmap时,获得旋转的角度,再进行相应的旋转操作就可以了。 */ public static int readPictureDegree(String path) { int degree = 0; try { if (TextUtils.isEmpty(path)) return degree; ExifInterface exifInterface = new ExifInterface(path); int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); switch (orientation) { case ExifInterface.ORIENTATION_ROTATE_90: degree = 90; break; case ExifInterface.ORIENTATION_ROTATE_180: degree = 180; break; case ExifInterface.ORIENTATION_ROTATE_270: degree = 270; break; } } catch (IOException e) { e.printStackTrace(); } return degree; } public static float toLatLng(String dfm) { String[] dfmArr = dfm.split(","); if (dfmArr.length > 1) { float d = (toLatLngSub(dfmArr[0])); float f = toLatLngSub(dfmArr[1]); float m = toLatLngSub(dfmArr[2]); f = f + (m / 60); return (f / 60) + (d); } return 0; } public static float toLatLngSub(String arg) { String[] args = arg.split("/"); float a = Float.parseFloat(args[0]); float b = Float.parseFloat(args[1]); return a / b; }
相关文章推荐
- 关于Confusion Matrix
- 数据结构——顺序栈的学习
- 如何将Provisioning Profile安装到开发的Mac系统上
- 如何将Provisioning Profile安装到开发的Mac系统上
- LVS+Keepalived配置示例
- linux 隐藏进程 - crux实现
- VB.Net矩阵求特征值
- OC运行时简单运用(2)
- 解决xcode升级之后安装的插件失效
- 如何将Provisioning Profile安装到开发的Mac系统上
- fireDAC oracle
- 搞不清FastCgi与PHP-fpm之间是个什么样的关系
- Python 代码调试技巧 (转载自:IBM developerWorks 张颖)
- 什么是凸函数
- Netty的FastThreadLocal
- iOS开发UI调试利器Reveal简单使用
- 两种禁止USB autosuspend的方法
- 9款免费的跨浏览器测试工具
- php生成utf-8文件
- 深入学习AngularJS中数据的双向绑定机制