Android ExifInterface 学习笔记,图片旋转的操作。

     

        ExifInterface类主要描述多媒体文件比如JPG格式图片的一些附加信息,包括拍 摄时的光圈、快门、白平衡、ISO、焦距、日期时间等各种和拍摄条件以及相机品牌、型号、色彩编码、拍摄时录制的声音以及全球定位系统(GPS)、缩略图 等。简单地说,Exif=JPEG+拍摄参数。该类位于android.media.ExifInterface的位置,需要调用API Level至少为5即2.0 SDK。

      所有的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感光度 
  ExifVersionExif版本 
  DateTimeOriginal创建时间 
  DateTimeDigitized数字化时间 
  ComponentsConfiguration图像构造(多指色彩组合方案) 
  CompressedBitsPerPixel(BPP)压缩时每像素色彩位 指压缩程度 
  ExposureBiasValue曝光补偿。 
  MaxApertureValue最大光圈 
  MeteringMode测光方式, 平均式测光、中央重点测光、点测光等。 
  Lightsource光源 指白平衡设置 
  Flash是否使用闪光灯。 
  FocalLength焦距,一般显示镜头物理焦距,有些软件可以定义一个系数,从而显示相当于35mm相机的焦距 MakerNote(User Comment)作者标记、说明、记录 
  FlashPixVersionFlashPix版本 (个别机型支持) 
  ColorSpace色域、色彩空间 
  ExifImageWidth(Pixel X Dimension)图像宽度 指横向像素数 
  ExifImageLength(Pixel Y Dimension)图像高度 指纵向像素数 
  Interoperability IFD通用性扩展项定义指针 和TIFF文件相关,具体含义不详 
  FileSource源文件 Compression压缩比。 

       Camera中拍照流程 

       在Android Camera程序开发过程中,要用到Exif相关的知识,如果处理不当,会导致拍摄的JPEG图片无法正常浏览。 
       在Froyo(Android 2.2)源码中的Camera应用是不对Exif信息进行写操作,而只是读操作,对于Exif的写操作是交给Camera硬件抽象层去完成,这是 google的设计逻辑。但是不同的Android平台及其相关子平台,再加上不同的Camera应用,相互交替,排列组合,或许会出现这样一种情况:底 层没有去写Exif,而上层应用也没有写Exif信息,那么图片的显示信息将会丢失。其中影响最为严重的是Orientation这个参数。 
       我们可以根据图片保存的路径来获取图片的旋转角度,代码如下:
         /**
     * 获取图片的旋转角度
     * @Title: readPictureDegree
     * @param path
     * @return
     * @return int
     * @date 2012-12-4 上午9:22:33
     */
    private  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;  
    }  
      如果相机底层出现了异常,拍摄的照片进行了旋转,我们就可以在应用程序的上层通过ExifInterface来进行修复,以使用话看到的照片是正常的,即没有经过旋转的。对旋转的照片进行处理很简单,ExifInterface给我们提供了一个方法setAttribute可以对图片的属性进行操作。下面给出一个例子来说明对旋转图片的纠错处理,代码如下:
     /**
     * 将图片的旋转角度置为0
     * @Title: setPictureDegreeZero
     * @param path
     * @return void
     * @date 2012-12-10 上午10:54:46
     */
    private void setPictureDegreeZero(String path){
    try {
ExifInterface exifInterface = new ExifInterface(path);
//修正图片的旋转角度,设置其不旋转。这里也可以设置其旋转的角度,可以传值过去,
//例如旋转90度,传值ExifInterface.ORIENTATION_ROTATE_90,需要将这个值转换为String类型的
exifInterface.setAttribute(ExifInterface.TAG_ORIENTATION, "no");
exifInterface.saveAttributes();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}  
   
    }
     这样操作之后,拍照角度出错的图片就会以正常的角度呈现在用户面前。
          
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值