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

    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信息:

     

    //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;
        }
  • 相关阅读:
    为什么Android的图片质量会比iPhone的差?
    第二次作业-编程
    印像最深的三位老师
    c++的类型转换(转)
    SpringMVC入门详解
    java基础
    springmvc
    Maven配置下载包速度更快
    spring中的bean.xml
    pom.xml依赖
  • 原文地址:https://www.cnblogs.com/niray/p/5241981.html
Copyright © 2011-2022 走看看