zoukankan      html  css  js  c++  java
  • JPEG图像扩展信息读取和修改

    最近,项目需要使用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节点的话,那么前边的转换方法就能够省掉了。有兴趣的朋友能够考呵呵证书。




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

  • 相关阅读:
    记一个诡异的.net framework问题造成的系统问题(visual studio不能build或不能正常运行代码,所有基于.net framework的代码无法运行)
    Dependency Walker工具:定位DLL缺失位置
    (转)MVC4.0教程
    剑灵-控制技能图及武器升级图
    (转)哑铃健身图解大全
    Python-第三方库requests详解
    Mac更改PHP默认目录的方法
    MySQL语句之数据的增删改查
    mysql语句之DDL
    linux下查看某个文件位置的方法
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/4852485.html
Copyright © 2011-2022 走看看