介绍 ExifInterface 支持库

发布于 2024-11-28 17:43:28 字数 7236 浏览 8 评论 0

随着 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)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

夏花。依旧

暂无简介

文章
评论
27 人气
更多

推荐作者

卖梦商人

文章 0 评论 0

聊慰

文章 0 评论 0

内心荒芜

文章 0 评论 0

mb_vBKS9whW

文章 0 评论 0

俯瞰星空

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文