ExifInterface类主要描述多媒体文件比如JPG格式图片的一些附加信息,包括拍摄时的光圈、快门、白平衡、ISO、焦距、日期时间等各种和拍摄条件以及相机品牌、型号、色彩编码、拍摄时录制的声音以及全球定位系统GPS、缩略图等信息。简单地说,Exif=JPEG+拍摄参数。
        所有的JPEG文件以字符串“0xFFD8”开头,并以字符串“0xFFD9”结束。文件头中有一系列“0xFF??”格式的字符串,称为“标识”,用来 标记JPEG文件的信息段。“0xFFD8”表示图像信息开始,“0xFFD9”表示图像信息结束,这两个标识后面没有信息,而其它标识紧跟一些信息字 符。
        0xFFE0 -- 0xFFEF之间的标识符称为“应用标记”,没有被常规JPEG文件利用,Exif正是利用这些信息串记录拍摄信息的。按照Exif2.1标准对这些标识符的定义,数码相机可以把各种拍摄信息记入数码图像中,应用软件可以读取这些数据,再按照Exif2.1标 准,检索出它们的具体含义。
        一般而言包括以下一些信息:
  • Image Description 图像描述、来源。指生成图像的工具
  • Artist 作者 有些相机可以输入使用者的名字
  • Make 生产者 指产品生产厂家
  • Model 型号 指设备型号
  • Orientation 方向 有的相机支持,有的不支持
  • XResolution/YResolution X/Y方向分辨率
  • ResolutionUnit 分辨率单位 一般为PPI
  • Software 软件 显示固件Firmware版本
  • DateTime 日期和时间
  • YCbCrPositioning 色相定位
  • ExifOffsetExif 信息位置,定义Exif在信息在文件中的写入,有些软件不显示
  • ExposureTime 曝光时间 即快门速度
  • FNumber 光圈系数
  • ExposureProgram 曝光程序 指程序式自动曝光的设置,各相机不同,可能是Sutter Priority、Aperture Priority等等
  • ISO speed ratings 感光度
  • ExifVersion Exif版本
  • DateTimeOriginal 创建时间
  • DateTimeDigitized 数字化时间
  • ComponentsConfiguration 图像构造,多指色彩组合方案
  • CompressedBitsPerPixel(BPP) 压缩时每像素色彩位 指压缩程度
  • ExposureBiasValue 曝光补偿
  • MaxApertureValue 最大光圈
  • MeteringMode 测光方式, 平均式测光、中央重点测光、点测光等
  • Lightsource光 源 指白平衡设置
  • Flash 是否使用闪光灯
  • FocalLength 焦距,一般显示镜头物理焦距,有些软件可以定义一个系数,从而显示相当于35mm相机的焦距MakerNote(User Comment) 作者标记、说明、记录
  • FlashPixVersion FlashPix版本,个别机型支持
  • ColorSpace 色域、色彩空间
  • ExifImageWidth(Pixel X Dimension) 图像宽度,指横向像素数
  • ExifImageLength(Pixel Y Dimension) 图像高度,指纵向像素数
  • Interoperability IFD 通用性扩展项定义指针和TIFF文件相关,具体含义不详
  • FileSource 源文件 Compression压缩比

        在Android Camera程序开发过程中,要用到Exif相关的知识,如果处理不当,会导致拍摄的JPEG图片无法正常浏览。
        在Froyo(Android 2.2)源码中的Camera应用是不对Exif信息进行写操作,而只是读操作,对于Exif的写操作是交给Camera硬件抽象层去完成,这是 google的设计逻辑。但是不同的Android平台及其相关子平台,再加上不同的Camera应用,相互交替,排列组合,或许会出现这样一种情况:底 层没有去写Exif,而上层应用也没有写Exif信息,那么图片的显示信息将会丢失。其中影响最为严重的是Orientation这个参数。   

ExifInterface 多媒体文件附加信息-LMLPHP
public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        TextView textView = new TextView(this);
        textView.setText("获取到的信息");
        ExifInterface exif = null;
        try {
            exif = new ExifInterface(Environment.getExternalStorageDirectory().getPath() + "/pic.jpg");
        } catch (IOException e) {
            e.printStackTrace();
        }
        if (null == exif) {
            textView.append("\n" + "神马都没有");
        } else {
            textView.append(getPicInformation(exif));
        }
        setContentView(textView);
    }
    public static String getPicInformation(ExifInterface exif) {
        StringBuilder sBuilder = new StringBuilder();
        sBuilder.append("\n光圈:" + exif.getAttribute(ExifInterface.TAG_APERTURE));//2.0
        sBuilder.append("\n拍摄日期:" + exif.getAttribute(ExifInterface.TAG_DATETIME));//2016:05:15 21:34:21
        sBuilder.append("\n曝光时间:" + exif.getAttribute(ExifInterface.TAG_EXPOSURE_TIME));// 0.030
        sBuilder.append("\n是否有闪光灯:" + exif.getAttribute(ExifInterface.TAG_FLASH));// 0
        sBuilder.append("\n焦距: " + exif.getAttribute(ExifInterface.TAG_FOCAL_LENGTH));//4620/1000
        sBuilder.append("\n海拔: " + exif.getAttribute(ExifInterface.TAG_GPS_ALTITUDE));//0/100
        sBuilder.append("\n海拔参数:" + exif.getAttribute(ExifInterface.TAG_GPS_ALTITUDE_REF));// 1
        sBuilder.append("\n时间戳:" + exif.getAttribute(ExifInterface.TAG_GPS_DATESTAMP));// 2016:05:15
        sBuilder.append("\n维度: " + exif.getAttribute(ExifInterface.TAG_GPS_LATITUDE));//23/1,5/1,45224761/1000000
        sBuilder.append("\n南半球还是北半球:" + exif.getAttribute(ExifInterface.TAG_GPS_LATITUDE_REF));// N
        sBuilder.append("\n经度: " + exif.getAttribute(ExifInterface.TAG_GPS_LONGITUDE));//113/1,19/1,23122558/1000000
        sBuilder.append("\n东区还是西区:" + exif.getAttribute(ExifInterface.TAG_GPS_LONGITUDE_REF));// E
        sBuilder.append("\n高: " + exif.getAttribute(ExifInterface.TAG_IMAGE_LENGTH));//5152
        sBuilder.append("\n宽: " + exif.getAttribute(ExifInterface.TAG_IMAGE_WIDTH));//3888
        sBuilder.append("\n感光度: " + exif.getAttribute(ExifInterface.TAG_ISO));//200
        sBuilder.append("\n生产厂家:" + exif.getAttribute(ExifInterface.TAG_MAKE));// HUAWEI
        sBuilder.append("\n设备型号: " + exif.getAttribute(ExifInterface.TAG_MODEL));//PLK-AL10
        sBuilder.append("\n旋转角度: " + exif.getAttribute(ExifInterface.TAG_ORIENTATION));//1
        sBuilder.append("\n白平衡:" + exif.getAttribute(ExifInterface.TAG_WHITE_BALANCE));// 0
        sBuilder.append("\n旋转角度为:" + readPictureDegree(Environment.getExternalStorageDirectory().getPath() + "/pic.jpg") + "°");
        return sBuilder.toString();
    }
    /**获取图片的旋转角度    */
    public static int readPictureDegree(String path) {
        int degree = 0;
        try {
            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;
            default:
                degree = 0;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return degree;
    }
}

04-17 19:39