【Android】 Exif 接口

12 篇文章 0 订阅
1 篇文章 0 订阅

前言

我们在应用程序中广泛使用图像。对于某些图像相关应用程序,需要图像的所有详细信息。但是我们不能总是直接从图像中读取图像的细节。可能需要了解图像详细信息,例如 GPS 位置、日期/时间、拍摄时的设置、方向等。

以前我们很难获取图像信息,为此我们必须从不同的方法中分别提取元数据并读取它以了解图像属性。即使当我们阅读时,对图像的更改(例如删除 GPS 标签或更改方向)也将是一项具有挑战性的任务。

这些的解决方案是 Exif 文件和 ExifInterface。

让我们了解一下EXIF是什么?

什么是Exif?

Exif 代表可交换图像文件格式。这是一个标准,它定义了与相机捕获的图像或其他媒体相关的特定信息。它能够存储相机曝光、拍摄图像的日期/时间,甚至 GPS 位置等重要数据。示例 Exif 文件看起来像,

安卓中的ExifInterface

我们了解什么是 Exif 及其包含的内容。让我们看看如何从 Android 中的图像中提取 Exif 数据。ExifInterface 自 25.1.0 起已在 android 支持库中引入。尽管这自 7.1 以来就已经存在,但从 android 9+ 开始,它具有提供给界面的所有功能。添加了 100 多个属性来读取图像的 Exif 标签,包括有关相机本身、相机设置、方向和 GPS 坐标的信息。目前,它只能读取 JPEG 文件或 RAW 图像文件的 Exif。支持的格式有 JPEG、DNG、CR2、NEF、NRW、ARW、RW2、ORF、PEF、SRW、RAF 和 HEIF。

如果您想使用 ExifInterface,您需要将以下依赖项添加到您的 build.gradle。

implementation "androidx.exifinterface:exifinterface:1.3.1"

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

如何读取 Exif 属性?

现在让我们了解如何读取不同来源的 EXIF 属性以及使用 ExifInterface 的一些用例。对于大多数属性,您只需根据需要使用 getAttributeInt()、getAttributeDouble() 或 getAttribute()(对于字符串)方法。

从内容 Uri 中提取信息

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 不适用于远程 InputStream,例如从 HttpURLConnection 返回的那些。强烈建议仅将它们与 content:// 或 file:// URI 一起使用。

对于相机应用

对于Camera 应用程序,捕获图像后的写入属性更为重要。到目前为止,它仍然仅限于 JPEG 图像。使用ExifInterface,我们可以轻松更改已设置的 JPEG_ORIENTATION、JPEG_GPS_LOCATION 或等效项。我们还可以根据用户的请求移除这些属性。

var  exif  : ExifInterface  = ExifInterface(pictureFile.getAbsolutePath())
exif.setAttribute(ExifInterface.TAG_ORIENTATION, "" + getPhotoOrientation(configurationProvider.getSensorPosition()))
exif.saveAttributes()

处理方向

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

int rotation = 0;
int orientation = exifInterface.getAttributeInt(
ExifInterface.TAG_ORIENTATION,
ExifInterface.ORIENTATION_UNDEFINED);
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 旋转角度进行位图旋转

首先,创建 ExifInterface:

ExifInterface exif = new ExifInterface(uri.getPath());

接下来,找到当前旋转:

int rotation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_UNDEFINED);

将 Exif 旋转转换为度数:

int rotationInDegrees = exifToDegrees(rotation);

在哪里

private fun exifToDegrees(exifOrientation: Int): Int {
    if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_90) {
        return 90
    } else if (exifOrientation ==   ExifInterface.ORIENTATION_ROTATE_180) {
        return 180
    } else if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_270) {
        return 270
    }
    return 0
}

然后使用图像的实际旋转作为参考点,使用 Matrix 旋转图像。

Matrix matrix = new Matrix();
if (rotation != 0) {
    matrix.postRotate(rotationInDegrees);
}

您可以使用将 Matrix 作为参数的 Bitmap.createBitmap 方法创建新的旋转图像:

Bitmap.createBitmap(Bitmap source, int x, int y, int width, int height, Matrix m, boolean filter)

哪里matrix有新的轮换:

Bitmap adjustedBitmap = Bitmap.createBitmap(sourceBitmap, 0, 0, width, height, matrix, true)

我们如何使用 ExifInterface 的一些用例。

  • ExifInterface 用于在拍照时写入图像信息。在将图像保存到手机存储时处理方向也很有帮助。
  • 我们可能需要减小图像大小并更新 Exif 信息,为此,我们必须获取 Exif 信息并将更新的信息保存回图像。
  • ExifInterface 还用于获取和解析图像标题。
  • 旋转设备时保持设备的视图方向不变。
  • 从图库中获取图像并以正确的方向和保存图像的其他属性显示它。

这都是关于 ExifInterface 的。今天我们学习了ExifInterface。希望对这个话题有所了解。

这里我就分享一份资料,希望可以帮助到大家提升进阶。

内容包含:Android学习PDF+架构视频+面试文档+源码笔记高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 这几块的内容。分享给大家,非常适合近期有面试和想在技术道路上继续精进的朋友。

如果你有需要的话,可以扫描下方二维码,免费获取Android学习PDF+架构视频+面试文档+源码笔记领取方式
请添加图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
内容简介   《google android sdk开发范例大全(第3版)》在上一版的基础上,以android手机应用程序开发(采用android sdk 2.3.3)为主题,超过200多个范例全面且深度地整合了手机、网络及服务等多个开发领域,为读者提高程序设计能力提供了很大的帮助。    全书共分11章,主要以范例集的方式来讲述android的知识点,详细介绍了开发android的人机交互界面、android常用的开发控件、android手机收发短信等通信服务、开发android手机的自动服务功能和娱乐多媒体功能以及整合android与google强大的网络服务等内容。随书光盘中包括了所有范例的程序代码。    《google android sdk开发范例大全(第3版)》继承前两版由浅入深的方式,范例总数由原先的160多个增加到了200多个,在用户交互界面、手机控件、交互式通信服务、手机自助服务、娱乐多媒体等方面均增加了相应的范例来介绍新的开发技术,特别是新增加了第11章来专门介绍html5技术在android移动设备里的应用,相信当下两个热门技术的交汇会碰撞出不一样的火花。    《google android sdk开发范例大全(第3版)》内容由android的基础知识到实际开发应用,结构清晰、语言简洁,非常适合android的初学者和android的进阶程序开发者阅读参考。 目录 《google android sdk开发范例大全(第3版)》 第1章 了解、深入、动手做 1 1.1 红透半边天的android 2 1.2 本书目的及范例涵盖范围 3 1.3 如何阅读本书 4 1.4 使用本书范例 5 1.5 参考网站 6 第2章 android初体验 7 2.1 安装android sdk与adt/ddms 8 2.2 创建第一个android项目(hello android!) 11 2.3 android应用程序架构——从此开始 15 2.4 可视化的界面开发工具 18 2.5 部署应用程序到android手机 19 第3章 用户人机界面 22 3.1 更改与显示文字标签 23 3.2 更改手机窗口画面底色 24 3.3 更改textview文字颜色 26 3.4 置换textview文字 28 3.5 取得手机屏幕大小 29 3.6 样式化的定型对象 30 .3.7 简易的按钮事件 32 3.8 手机页面的转换 34 3.9 调用另一个activity 37 3.10 不同activity之间的数据传递 41 3.11 返回数据到前一个activity 44 3.12 具有交互功能的对话框 49 3.13 置换文字颜色的机关 51 3.14 控制不同的文字字体 52 3.15 如iphone拖动相片特效 54 3.16 自制计算器 56 3.17 关于(about)程序信息 58 3.18 程序加载中,请稍候 61 3.19 全屏幕以按钮重写 63 3.20 今晚到哪儿打牙祭 64 3.21 android变脸 67 3.22 打勾显示输入的密码 69 3.23 android多语系支持 71 3.24 判断手机操作系统版本是否允许运行程序 72 3.25 两个不同的程序彼此调用 75 3.26 指定安装应用程序迁移至sd卡 78 3.27 手机动态layout主题随手势物换迁移 79 第4章 史上超豪华的手机控件 84 4.1 edittext与textview共舞 85 4.2 设计具有背景图的按钮 86 4.3 给圣诞老人的信息 88 4.4 我同意条款 90 4.5 消费券采购列表 92 4.6 向左或向右 94 4.7 专业相框设计 96 4.8 自定义下拉菜单模式 99 4.9 动态添加/删除的spinner菜单 102 4.10 心爱小宝贝相片集 104 4.11 快速地搜索手机文件引擎 107 4.12 按钮也能随单击变换 109 4.13 具自动提示功能的菜单 110 4.14 数字及模拟小时钟设计 112 4.15 动态输入日期与时间 114 4.16 猜猜红桃a在哪儿 117 4.17 后台程序运行进度提示 121 4.18 动态文字排版 124 4.19 在activity里显示列表 128 4.20 以动态列表配置选项 130 4.21 查找程序根目录下所有文件 134 4.22 加载手机磁盘里的图片文件 137 4.23 动态放大缩小imageview里的图片 139 4.24 动态旋转图片 142 4.25 猜猜我在想什么 145 4
基本信息 Google Android SDK开发范例大全(第3版) 作者:王世江(改编), 佘志龙(作者), 陈昱勋(作者), 郑名杰(作者), 等(作者) 出版社: 人民邮电出版社; 第3版 (2011年11月1日) 丛书名: 移动开发系列丛书 平装: 818页 正文语种: 简体中文 开本: 16 ISBN: 9787115264305 条形码: 9787115264305 商品尺寸: 26 x 18.4 x 3.8 cm 商品重量: 1.3 Kg 编辑本段 内容简介 《Google Android SDK开发范例大全(第3版)》在上一版的基础上,以Android手机应用程序开发(采用Android SDK 2.3.3)为主题,超过200多个范例全面且深度地整合了手机、网络及服务等多个开发领域,为读者提高程序设计能力提供了很大的帮助。 全书共分11章,主要以范例集的方式来讲述Android的知识点,详细介绍了开发Android的人机交互界面、Android常用的开发控件、Android手机收发短信等通信服务、开发Android手机的自动服务功能和娱乐多媒体功能以及整合Android与Google强大的网络服务等内容。随书光盘中包括了所有范例的程序代码。 《Google Android SDK开发范例大全(第3版)》继承前两版由浅入深的方式,范例总数由原先的160多个增加到了200多个,在用户交互界面、手机控件、交互式通信服务、手机自助服务、娱乐多媒体等方面均增加了相应的范例来介绍新的开发技术,特别是新增加了第11章来专门介绍HTML5技术在Android移动设备里的应用,相信当下两个热门技术的交汇会碰撞出不一样的火花。 《Google Android SDK开发范例大全(第3版)》内容由Android的基础知识到实际开发应用,结构清晰、语言简洁,非常适合Android的初学者和Android的进阶程序开发者阅读参考。 编辑本段 编辑推荐 《Google Android SDK开发范例大全(第3版)》:全新2.3以上版本精彩范例。新增HTML5手机应用程序范例。影音功能大突破,领先业界的影音播放功能详解。易于阅读的架构设计,边看边学,每个范例均搭配步骤及完成画面。每个范例后面均有扩展学习,在学习范例应用的同时延伸思考。汲取专家经验,指引入门捷径。 移动网络设备(MID,Mobile Internet Device)的发展趋势锐不可当,其中以智能手机最受瞩目。 《Google Android SDK开发范例大全(第3版)》采用范例集的形式,由浅入深地带领Google Android SDK初学者,以及具备Java基础的程序设计人员逐步掌握开发MID的能力。同时,书中200多个范例均可作为开发样板,以此抛砖引玉,进而拓展程序设计人员开发MID的无限可能。精彩范例,原创展现。 更炫的移动设备人机界面配置:豪华Widget、Home Screen App Widgets、隐藏式抽屉-Sliding Drawer等闪亮登场! 完整的手机数据存取功能:铃声模式设置、震动控制、WiFi服务、屏幕旋转、电池计量、温度测量、电信网络信息、SIM卡信息、拨打电话、短信解析、通讯录联系人、电子罗盘、屏幕手写等手机控制功能。 系统服务及研发的整合:网络搜索、联系人、音乐、应用程序、定制手机文件管理、记忆卡I/O存取、双向短信、闹钟服务、开机程序、来电通信互动、拜年短信、信息提醒、电池电量显示、进度显示、取得应用程序信息等。 超酷的娱乐多媒体设计:触控移动事件、建立手势、手势判断控制、屏幕保护程序、启动动画、mp3播放器、3gp影片播放、相机预览拍照、自动对焦、调整音量、信息指令遥控手机、录音控制、自定义动画按钮等 Web Service存取服务:内嵌网页浏览器、Ajax网页特效、手机气象局、网络播放mp3、网络安装apk程序、远程下载手机铃声、XML-RPC移动博客发布器、手机RSS阅读器、地震速报、网页快照等。 完备的Google网络服务:Google语音搜寻、Google远程账号登录、Google Search API、Google Chart API、Google Picasa手机相册、Google Translate API整合等。 Google Map应用:GPS定位、规划导航路径、GPS Google地图、地址反查地理坐标等卫星全球定位实例。 创意程序设计:即时动态桌面、电蚊香、转转轮盘、任务管理器、中英发音字典、手机手电筒、GPS轨迹记录器、女性贴身计时、QR Code二维条码生成器、手机OR Code扫描仪、热量骰子、掷杯筊、正妹墙相簿浏览器、You Tube影片FLV文件下载器等。 HTML5结合Mobile:控制手机

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值