ExifInterface 多媒体文件附加信息

2023-03-14,,

简介


        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这个参数。   

案例


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;     } }

来自为知笔记(Wiz)

ExifInterface 多媒体文件附加信息的相关教程结束。

《ExifInterface 多媒体文件附加信息.doc》

下载本文的Word格式文档,以方便收藏与打印。