Android下的EXIF是什么

2019-12-10 18:24:09王振洲

5.第4个callback返回数据(这个callback是最重要的,而且是不可缺省的,也就是说前3个callback设置成Null也不会影响拍照功能),见如下代码:

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方向参数的。

  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是我们缓存的应用传给底层的值)。