介绍ExifInterface支持库

原标题:Introducing the ExifInterface Support Library
链接:https://android-developers.googleblog.com/2016/12/introducing-the-exifinterface-support-library.html
作者:Ian Lake (开发者倡导者) 翻译:arjinmc

随着25.1.0 Support Library的发布,这个大家庭还有一个新的入口:ExifInterface支持库。在Android 7.1中引入了显著改进框架的ExifInterface,只有通过支持库才能使所有API 9+设备都可用ExifInterface

基础部分仍然是相同的:阅读和写作能力的Exif嵌入图像文件内的标签:现在有140种不同的属性(对于Android 7.1 /此支持库!有近100个新属性),包括对相机本身的相机设置信息,方向和GPS坐标。

相机应用程序:写入Exif属性

对于Camera应用程序,写入可能是最重要的 - 写入属性仍然局限于JPEG图像文件。现在,通常你会不会需要实际的摄像头捕获本身期间使用这个-你会改为调用API Camera2 CaptureRequest.Builder.set())用JPEG_ORIENTATIONJPEG_GPS_LOCATION或等同Camer1的Camera.Parameters。但是,使用ExifInterface允许你在事实之后对文件进行更改(例如,删除用户请求中的位置信息)。

读取Exif属性

对于我们其他人来说,阅读这些属性将是我们的实用的,这是我们看到最大改善的地方。

首先,你可以从JPEG和原始图像(特别是DNG,CR2,NEF,NRW,ARW,RW2,ORF,PEF,SRW和RAF文件)读取Exif数据。在这之下,这是一个重大的重组,删除所有本地依赖项,并建立一个广泛的测试套件,以确保一切正常工作。

对于使用content://URI可以从其他应用程序接收图像的应用程序(例如,目标为API 24或更高版本的应用程序发送的应用程序),ExifInterface现在可直接使用InputStream; 这使你可以直接从content://你接收的URI中直接提取Exif信息,而无需创建临时文件。

Uri uri; // the URI you've received from the other app
InputStream in;
try {
  in = getContentResolver().openInputStream(uri);
  ExifInterface exifInterface = new ExifInterface(in);
  // Now you can extract any Exif tag you want
  // Assuming the image is a JPEG or supported raw format
} catch (IOException e) {
  // Handle any errors
} finally {
  if (in != null) {
    try {
      in.close();
    } catch (IOException ignored) {}
  }
}

注意ExifInterface不能与远程InputStreams一起使用,比如从那些HttpURLConnection返回的a。强烈建议只使用它们content://file://URI。

对于大多数的属性,你会简单地使用getAttributeInt()),getAttributeDouble())或getAttribute())(String类型),相应的方法。

显示图像时最重要的属性之一是图像方向,存储在适当的名称TAG_ORIENTATION,它返回一个ORIENTATION_常量。要将其转换为旋转角度,你可以后处理该值。

int rotation = 0;
int orientation = exifInterface.getAttributeInt(
    ExifInterface.TAG_ORIENTATION,
    ExifInterface.ORIENTATION_NORMAL);
switch (orientation) {
  case ExifInterface.ORIENTATION_ROTATE_90:
    rotation = 90;
    break;
  case ExifInterface.ORIENTATION_ROTATE_180:
    rotation = 180;
    break;
  case ExifInterface.ORIENTATION_ROTATE_270:
    rotation = 270;
    break;
}

有一些有用的方法可以从特定的Exif标签中提取值。对于位置数据,该getLatLong())方法以浮点形式给出经纬度,而getAltitude())并以米为单位给出高度。一些图片还嵌入了一个小缩略图。你可以检查它的存在,hasThumbnail())然后提取byte[]缩略图的表示getThumbnail())- 完美的传递给BitmapFactory.decodeByteArray())。

使用Exif:一切都是可选的

有一件重要的事情要理解Exif数据是没有必要的标签:每个标签是可选的 - 一些服务甚至专门剥离Exif数据。因此,在整个代码中,应始终处理没有Exif数据的情况,要么是由于没有特定属性的数据,要么是根本不支持Exif数据的图像格式(比如无处不在的PNG或WebP图像)。

使用以下依赖项将ExifInterface支持库添加到你的项目中:

compile "com.android.support:exifinterface:25.1.0"

但是,当Exif属性恰好是在你的应用程序中防止错误旋转的图像,ExifInterface支持库正是你需要的#BuildBetterApps(构建更好的app)

results matching ""

    No results matching ""