我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android下的EXIF是什么

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android下的EXIF是什么

一.什么是Exif
Exif(Exchangeable Image File 可交换图像文件)是一种图象文件格式,它的数据存储与JPEG格式是完全相同的。实际上Exif格式就是在JPEG格式头部插入了数码照片的信息,包括拍 摄时的光圈、快门、白平衡、ISO、焦距、日期时间等各种和拍摄条件以及相机品牌、型号、色彩编码、拍摄时录制的声音以及全球定位系统(GPS)、缩略图 等。简单地说,Exif=JPEG+拍摄参数。因此,你可以利用任何可以查看JPEG文件的看图软件浏览Exif格式的照片,但并不是所有的图形程序都能 处理 Exif信息。

所有的JPEG文件以字符串“0xFFD8”开头,并以字符串“0xFFD9”结束。文件头中有一系列“0xFF??”格式的字符串,称为“标识”,用来 标记JPEG文件的信息段。“0xFFD8”表示图像信息开始,“0xFFD9”表示图像信息结束,这两个标识后面没有信息,而其它标识紧跟一些信息字 符。
  0xFFE0 -- 0xFFEF之间的标识符称为“应用标记”,没有被常规JPEG文件利用,Exif正是利用这些信息串记录拍摄信息如快门速度、光圈值等,甚至可以包括全 球定位信息。按照Exif2.1标准对这些标识符的定义,数码相机可以把各种拍摄信息记入数码图像中,应用软件可以读取这些数据,再按照Exif2.1标 准,检索出它们的具体含义,一般而言包括以下一些信息:
  Image Description 图像描述、来源. 指生成图像的工具
  Artist作者 有些相机可以输入使用者的名字
  Make 生产者 指产品生产厂家
  Model 型号 指设备型号
  Orientation方向 有的相机支持,有的不支持
  XResolution/YResolution X/Y方向分辨率 本栏目已有专门条目解释此问题。
  ResolutionUnit分辨率单位 一般为PPI
  Software软件 显示固件Firmware版本
  DateTime日期和时间
  YCbCrPositioning 色相定位
  ExifOffsetExif信息位置,定义Exif在信息在文件中的写入,有些软件不显示。
  ExposureTime 曝光时间 即快门速度
  FNumber光圈系数
  ExposureProgram曝光程序 指程序式自动曝光的设置,各相机不同,可能是Sutter Priority(快门优先)、Aperture Priority(快门优先)等等。
  ISO speed ratings感光度
  ExifVersionExif版本
  DateTimeOriginal创建时间
  DateTimeDigitized数字化时间
  ComponentsConfiguration图像构造(多指色彩组合方案)
  CompressedBitsPerPixel(BPP)压缩时每像素色彩位 指压缩程度
  ExposureBiasValue曝光补偿。
  MaxApertureValue最大光圈
  MeteringMode测光方式, 平均式测光、中央重点测光、点测光等。
  Lightsource光源 指白平衡设置
  Flash是否使用闪光灯。
  FocalLength焦距,一般显示镜头物理焦距,有些软件可以定义一个系数,从而显示相当于35mm相机的焦距 MakerNote(User Comment)作者标记、说明、记录
  FlashPixVersionFlashPix版本 (个别机型支持)
  ColorSpace色域、色彩空间
  ExifImageWidth(Pixel X Dimension)图像宽度 指横向像素数
  ExifImageLength(Pixel Y Dimension)图像高度 指纵向像素数
  Interoperability IFD通用性扩展项定义指针 和TIFF文件相关,具体含义不详
  FileSource源文件 Compression压缩比。

二.Camera中拍照流程

在Android Camera程序开发过程中,要用到Exif相关的知识,如果处理不当,会导致拍摄的JPEG图片无法正常浏览。
在Froyo(Android 2.2)源码中的Camera应用是不对Exif信息进行写操作,而只是读操作,对于Exif的写操作是交给Camera硬件抽象层去完成,这是 google的设计逻辑。但是不同的Android平台及其相关子平台,再加上不同的Camera应用,相互交替,排列组合,或许会出现这样一种情况:底 层没有去写Exif,而上层应用也没有写Exif信息,那么图片的显示信息将会丢失。其中影响最为严重的是Orientation这个参数。

Froyo camera的逻辑是这样的:
在Camera这个Activity中,有一个内部类ImageCapture,其中包含一个重要的方法:


private void capture() {
// Set rotation.
mParameters.setRotation(mLastOrientation);
....................
.....................
 mCameraDevice.setParameters(mParameters);
mCameraDevice.takePicture(mShutterCallback, mRawPictureCallback, mPostViewPictureCallback, new JpegPictureCallback(loc));
}

大致流程是这样的:
1.将拍照时相机的方向添加进Camera.Parameters的实例中;
2.将全部相机拍照参数传给android.hardware.Camera的对象;
3.调用方法takePicture,并设置好非常重要的4个callback;
4.生成Exif数据的事情就由HAL来完成;
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是我们缓存的应用传给底层的值)。


else if(orientation == 0 && EXIF_ORIENTATION != 0) {
        switch (EXIF_ORIENTATION) {
        case 90:
          orientation = ExifInterface.ORIENTATION_ROTATE_90;
          degree = 90;
          break;
        case 180:
          orientation = ExifInterface.ORIENTATION_ROTATE_180;
          degree = 180;
          break;
        case 270:
          orientation = ExifInterface.ORIENTATION_ROTATE_270;
          degree = 270;
          break;
        }
        exif.setAttribute(ExifInterface.TAG_ORIENTATION, Integer.toString(orientation));
        try {
          exif.saveAttributes();
        } catch (IOException e) {
           Log.e(TAG, "cannot save exif", e);
        }
      }

在应用层对于Exif的操作是通过android.media.ExifInterface接口完成的。
通过public void setAttribute (String tag, String value) 来设置,而获取可以通过 public int getAttributeInt (String tag, int defaultValue) 和 public String getAttribute (String tag) 两种方法都可以,getAttributeInt 重载方法一第二个参数为我们设置的默认值,如果成功则返回相应Tag的值;特定的整数内容为该方法直接返回值。而重载方法二该方法直接返回结果,如果失败则为null。

您可能感兴趣的文章:flex压缩图片exif信息(作者/相机)丢失问题解决Python读取图片EXIF信息类库介绍和使用实例PHP实现显示照片exif信息的方法PHP exif扩展方法开启详解python通过pil模块获得图片exif信息的方法python用来获得图片exif信息的库实例分析Java读取图片EXIF信息的方法PHP获取Exif缩略图的方法iOS开发中用imageIO渐进加载图片及获取exif的方法Android开发之使用ExifInterface获取拍照后的图片属性


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android下的EXIF是什么

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android下的EXIF是什么

一.什么是Exif Exif(Exchangeable Image File 可交换图像文件)是一种图象文件格式,它的数据存储与JPEG格式是完全相同的。实际上Exif格式就是在JPEG格式头部插入了数码照片的信息,包括拍 摄时的光圈、快门
2022-06-06

利用PHP读取到图片的EXIF信息的方法是什么

这篇文章主要讲解了“利用PHP读取到图片的EXIF信息的方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“利用PHP读取到图片的EXIF信息的方法是什么”吧!在我们拍的照片以及各类图像
2023-06-25

android下载更新的方法是什么

Android系统可以通过以下几种方式下载和更新应用程序:1. Google Play商店:Google Play商店是Android系统的官方应用商店,用户可以在商店中搜索并下载各种应用程序。Google Play商店会自动检查应用程序的
2023-08-24

Android的SplashScreen是什么

本篇内容主要讲解“Android的SplashScreen是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Android的SplashScreen是什么”吧!什么是SplashScreenS
2023-06-29

Android的surfaceflinger是什么

SurfaceFlinger是Android系统中的一个重要组件,它负责管理屏幕的渲染和显示。它是一个位于系统服务层的图形合成器,负责将应用程序的图形内容合成,并将其显示在设备的屏幕上。SurfaceFlinger使用Android的图形子
2023-09-27

idea下Android各目录所代表的含义是什么

这篇文章将为大家详细讲解有关idea下Android各目录所代表的含义是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1.Project模式结构模式1、.gradle和.idea这两个目录下都是And
2023-06-08

android surfaceflinger是什么

SurfaceFlinger是Android系统中的一个重要组件,它负责显示系统中所有图形界面和应用的绘制和渲染工作。它是Android的图形子系统的一个核心部分,负责管理和操作所有的Surface对象(即屏幕缓冲区)。SurfaceFli
2023-09-29

android rom是什么

Android ROM是指基于Android操作系统的固件或系统镜像。ROM是“Read-Only Memory”的缩写,意味着它的内容无法被用户修改。Android ROM可以包含操作系统的核心文件、应用程序、驱动程序和其他系统组件。用户
2023-08-23

android下载文件保存到本地的方法是什么

在Android中,可以使用以下代码将文件下载并保存到本地:1. 首先,需要在AndroidManifest.xml文件中添加以下权限:```xml```2. 然后,在代码中使用以下方法下载文件并保存到本地:```javaprivate v
2023-05-30

Linux下的ldd是什么

本篇内容主要讲解“Linux下的ldd是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Linux下的ldd是什么”吧!1、首先ldd不是一个可执行程序,而只是一个shell脚本2、ldd能够
2023-06-17

android leakcanary的原理是什么

Android LeakCanary是一个用于检测内存泄漏的开源库。它的原理主要包括以下几个步骤:1. 监测对象的引用关系:LeakCanary会监测应用中所有的对象引用关系,包括Activity、Fragment、View等。它会跟踪对象
2023-09-23

Android opengl的用法是什么

OpenGL是一个跨平台的图形库,用于渲染2D和3D图形。在Android上,使用OpenGL可以创建高性能的图形应用程序,包括游戏、模拟器、虚拟现实应用等。Android中使用OpenGL的一般步骤如下:1. 初始化OpenGL环境:在A
2023-10-07

android arouter的用法是什么

ARouter是一个用于在Android应用中进行页面跳转和参数传递的路由框架。它可以帮助开发者更方便地管理Activity之间的跳转关系,并且支持参数的传递和获取。ARouter的用法如下:配置依赖:在项目的build.gradle文件
android arouter的用法是什么
2024-03-02

android oaid的含义是什么

OAID 是“Android 广告标识符(Android Advertising ID)”的缩写。OAID 是一种类似于苹果设备上的 IDFA(Identifier for Advertisers)的设备标识符,用于在 Android 设备
android oaid的含义是什么
2024-03-15

Android ANR的原理是什么

本篇内容介绍了“Android ANR的原理是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、ANR说明和原因1.1 简介ANR全称:
2023-06-21

android ndk的作用是什么

Android NDK(Native Development Kit)是一个用于开发Android应用程序中使用C、C++或其他本地代码的工具集合。它的作用主要有以下几个方面:1. 提供高性能的本地代码支持:NDK允许开发者使用C、C++等
2023-08-23

android jetpack的用法是什么

Android Jetpack是一套库、工具和指南的集合,旨在帮助开发者更轻松地构建高质量的Android应用程序。它提供了一些常用的组件,可以帮助开发者处理常见的Android开发任务。以下是Android Jetpack的一些用法:1.
2023-10-10

android assets的作用是什么

Android assets的作用是存储应用程序所需的非代码资源文件,如图像、音频、视频、字体等。Assets目录下的文件可以通过AssetManager访问并加载到应用程序中。与res目录下的资源文件不同,assets目录中的文件可以保持
2023-09-16

android intent的作用是什么

Android Intent是Android系统中的一个重要组件,用于实现不同组件之间的通信和交互。它可以用于启动Activity、Service、Broadcast Receiver,以及发送广播和数据传递等。具体来说,Android
2023-10-25

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录