介绍 ExifInterface 支持库
随着 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_ORIENTATION , JPEG_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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论