登录 立即注册
安币:

查看: 455|回复: 4

Android下的EXIF是什么,exif信息是什么意思

[复制链接]

475

主题

963

帖子

5809

安币

手工艺人

发表于 2018-1-11 15:58:37 | 显示全部楼层 |阅读模式

        一.什么是exif
exif(exchangeable image file 可交换图像文件)是一种图象文件格式,它的数据存储与jpeg格式是完全相同的。实际上exif格式就是在jpeg格式头部插入了数码照片的信息,包括拍 摄时的光圈、快门、白平衡、iso、焦距、日期时间等各种和拍摄条件以及相机品牌、型号、色彩编码、拍摄时录制的声音以及全球定位系统(gps)、缩略图 等。简单地说,exif=jpeg+拍摄参数。因此,你可以利用任何可以查看jpeg文件的看图软件浏览exif格式的照片,但并不是所有的图形程序都能 处理 exif信息。

        所有的jpeg文件以字符串“0xffd8”开头,并以字符串“0xffd9”结束。文件头中有一系列“0xff

[Java] 查看源文件 复制代码
private void capture() {
// set rotation.
mparameters.setrotation(mlastorientation);
....................
.....................
 mcameradevice.setparameters(mparameters);

mcameradevice.takepicture(mshuttercallback, mrawpicturecallback, mpostviewpicturecallback, new jpegpicturecallback(loc));
}

        大致流程是这样的:
1.将拍照时相机的方向添加进camera.parameters的实例中;
2.将全部相机拍照参数传给android.hardware.camera的对象;
3.调用方法takepicture,并设置好非常重要的4个callback;
4.生成exif数据的事情就由hal来完成;
5.第4个callback返回数据(这个callback是最重要的,而且是不可缺省的,也就是说前3个callback设置成null也不会影响拍照功能),见如下代码:

[Java] 查看源文件 复制代码
private final class jpegpicturecallback implements picturecallback {
public void onpicturetaken(final byte[] jpegdata, final android.hardware.camera camera) {
//jpegdata为jpeg数据,是由hal层根据应用传输的各种参数(即camera.parameters的实例)以及jpeg压缩算法生成的。
mimagecapture.storeimage(jpegdata, camera, mlocation);
}
}

        三.exif使用方法及代码优化方案

        什么地方用到exif信息呢?我遇到的至少有如下这么几个地方:
1.生成右上角所略图;
2.图片显示应用,例如android自带的gallery3d应用;
3.图片回显;
4.短(彩)信等需要添加camera附件的应用.

        看看源码: imagemanager中是这样读取exif方向参数的。

[Java] 查看源文件 复制代码
  public static int getexiforientation(string filepath) {
    int degree = 0;
    exifinterface exif = null;
    try {
      exif = new exifinterface(filepath);
    } catch (ioexception ex) {
      log.e(tag, "cannot read exif", ex);
    }
    if (exif != null) {
      int orientation = exif.getattributeint(
        exifinterface.tag_orientation, -1);
      if (orientation != -1) {
        // we only recognize a subset of orientation tag values.
        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;
        }

      }
    }
    return degree;
  }

        这个方法可以进一步优化,从而对于exif信息的写入不再依赖底层。那就是比较一下传输给底层的orientation与实际返回的是否相等,不相等就是底层写入exif信息出错,我们就可以在应用层进行修正。
可以添加一个判断分支如下:(其中exif_orientation是我们缓存的应用传给底层的值)。

[Java] 查看源文件 复制代码
else if(orientation == 0 && exif_orientation != 0) {
        switch (exif_orientation) {
        case 90:
          orientation = exifinterface.orientation_rotate_90;
          degree = 90;
          break;
        case 180:
          orientation = exifinterface.orientation_rotate_180;
          degree = 180;
          break;
        case 270:
          orientation = exifinterface.orientation_rotate_270;
          degree = 270;
          break;
        }
        exif.setattribute(exifinterface.tag_orientation, integer.tostring(orientation));
        try {
          exif.saveattributes();
        } catch (ioexception e) {
           log.e(tag, "cannot save exif", e);
        }
      }

        在应用层对于exif的操作是通过android.media.exifinterface接口完成的。
通过public void setattribute (string tag, string value) 来设置,而获取可以通过 public int getattributeint (string tag, int defaultvalue) 和 public string getattribute (string tag) 两种方法都可以,getattributeint 重载方法一第二个参数为我们设置的默认值,如果成功则返回相应tag的值;特定的整数内容为该方法直接返回值。而重载方法二该方法直接返回结果,如果失败则为null。


6

主题

9341

帖子

2892

安币

Android大神

Rank: 6Rank: 6

发表于 2018-1-13 03:26:39 | 显示全部楼层
感谢分享,安卓巴士有你更精彩:lol

0

主题

9016

帖子

2393

安币

Android大神

Rank: 6Rank: 6

发表于 2018-1-14 05:06:11 | 显示全部楼层
不错不错,楼主辛苦了。。。
发表于 2018-1-14 21:58:05 | 显示全部楼层
安卓巴士是个不错的网站,我来顶个贴~

92

主题

9422

帖子

1994

安币

Android大神

Rank: 6Rank: 6

发表于 2018-1-15 10:08:18 | 显示全部楼层
帮帮顶顶!!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

站长推荐

通过邮件订阅最新安卓weekly信息
上一条 /4 下一条

下载安卓巴士客户端

全国最大的安卓开发者社区

联系我们
关闭
合作电话:
15618560077
Email:
805941275@qq.com
商务市场合作/投稿
问题反馈及帮助
联系我们

广告投放| 下载客户端|申请友链|手机版|站点统计|安卓巴士 ( 粤ICP备15117877号 )

快速回复 返回顶部 返回列表