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

Posted Android 从零单排

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
    }

 

以上是关于JPEG图片扩展信息读取与修改的主要内容,如果未能解决你的问题,请参考以下文章

pyqt5读取psd文件

MS Access 表单不显示扩展名为 .jpeg 的 JPEG 图片

在CentOS上为PHP安装Imagick和ImageMagick

w806开发板驱动ov2640读取jpeg图片1600x1200分辨率,以及花屏原因及解决办法

w806开发板驱动ov2640读取jpeg图片1600x1200分辨率,以及花屏原因及解决办法

libJPEG-turbo库使用示例代码