1 Exif是什么

  Exif是一种图像文件格式,它的数据存储于JPEG格式是完全相同的,实际上Exif格式就是JPEG格式头插入了 数码照片的信息,包括拍摄的光圈、快门、平衡白、ISO、焦距、日期时间等各种和拍摄条件以及相机品牌、型号、色彩编码以及GPS等。简单来 说,Exif=拍摄参数+JPED。因此,可以利用任何可以查看JPEG文件的看图软件浏览Exif信息,但是并不是所有图形程序都能处理Exif信息, 而自Android2.0之后,加入了对图片Exif数据的支持。

2 ExifInterface类介绍

  在Android下,通过ExifInterface类操作图片的Exif信息,虽然这个类的名字包含Interface,但它不是一个接口, 它是一个类,处于"android.media.ExifInterface"包下,是媒体库的一部分功能的实现。ExifInterface有一个构造 函数,接受一个String类型的数据,此为读取图片文件的地址。

  Exif数据在图片中可以理解为Key-value键值对的方式存储,一般通过如下几个方法操作:

  String getAttribute(String tag):获取图片中属性为tag的字符串值。

  double getAttribute(String tag,double defaultValue):获取图片中属性为tag的double值。

  int getAttributeInt(String tag,defaultValue):获取图片中属性为tag的int值。

  void setAttribute(String tag,String value):根据输入参数,设定图片Exif的值。

  void saveAttrubutes():把内存中图片的Exif写入到图片中。

3 上代码

public class MainActivity extends Activity {

  ArrayList<String> fileNames = new ArrayList<String>(); //本地图片路径
String imgPath;
StringBuilder text = new StringBuilder(); @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); fileNames.clear();
Cursor cursor = getContentResolver().query(Media.EXTERNAL_CONTENT_URI, null, null, null, null);
while (cursor.moveToNext()) {
byte[] data = cursor.getBlob(cursor.getColumnIndex(Media.DATA)); //图片的保存位置的数据
fileNames.add(new String(data, 0, data.length - 1));
} if (fileNames.size() > 0) {
imgPath = fileNames.get(4);
} TextView show = (TextView)findViewById(R.id.show);
//show.setText(imgPath); /*
* 目前Android SDK定义的Tag有: public static final String TAG_ORIENTATION = "Orientation"; 方向
public static final String TAG_DATETIME = "DateTime"; 时间日期
public static final String TAG_MAKE = "Make"; 设备制造商
public static final String TAG_MODEL = "Model"; 设备型号
public static final String TAG_FLASH = "Flash"; 闪光灯
public static final String TAG_IMAGE_WIDTH = "ImageWidth"; 图片宽
public static final String TAG_IMAGE_LENGTH = "ImageLength"; 图片长
public static final String TAG_GPS_LATITUDE = "GPSLatitude"; 纬度
public static final String TAG_GPS_LONGITUDE = "GPSLongitude"; 经度
public static final String TAG_GPS_LATITUDE_REF = "GPSLatitudeRef"; 纬度参考
public static final String TAG_GPS_LONGITUDE_REF = "GPSLongitudeRef"; 经度参考
public static final String TAG_EXPOSURE_TIME = "ExposureTime"; 曝光时间
public static final String TAG_APERTURE = "FNumber"; 光圈值
public static final String TAG_ISO = "ISOSpeedRatings";
*/ try {
//android读取图片EXIF信息
ExifInterface exifInterface=new ExifInterface(imgPath);
String Orientation=exifInterface.getAttribute(ExifInterface.TAG_ORIENTATION);
String DateTime=exifInterface.getAttribute(ExifInterface.TAG_DATETIME);
String Make=exifInterface.getAttribute(ExifInterface.TAG_MAKE);
String Model=exifInterface.getAttribute(ExifInterface.TAG_MODEL);
String Flash=exifInterface.getAttribute(ExifInterface.TAG_FLASH);
String ImageWidth=exifInterface.getAttribute(ExifInterface.TAG_IMAGE_WIDTH);
String ImageLength=exifInterface.getAttribute(ExifInterface.TAG_IMAGE_LENGTH);
String ExposureTime=exifInterface.getAttribute(ExifInterface.TAG_EXPOSURE_TIME);
String FNumber=exifInterface.getAttribute(ExifInterface.TAG_APERTURE);
String ISOSpeedRatings=exifInterface.getAttribute(ExifInterface.TAG_ISO); text.append("路径---" + imgPath + "\n");
text.append("方向---" + Orientation + "\n");
text.append("时间日期---" + DateTime + "\n");
text.append("设备制造商---" + Make + "\n");
text.append("设备型号---" + Model + "\n");
text.append("闪光灯---" + Flash + "\n");
text.append("图片宽---" + ImageWidth + "\n");
text.append("图片长---" + ImageLength + "\n");
text.append("曝光时间---" + ExposureTime + "\n");
text.append("光圈值---" + FNumber + "\n");
text.append("ISOSpeedRatings---" + ISOSpeedRatings + "\n"); exifInterface.setAttribute("mytag", "test");
text.append("mytag---" + exifInterface.getAttribute("mytag") + "\n"); } catch (Exception e) {
e.printStackTrace();
} show.setText(text); } }

注意要加上权限
  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

code见https://github.com/huanyi0723/ExifDemo

Android 图片Exif信息相关的获取与修改的更多相关文章

  1. Android -- 加载大图片到内存,从gallery获取图片,获取图片exif信息

    1. 加载大图片到内存,从gallery获取图片 android默认的最大堆栈只有16M, 图片像素太高会导致内存不足的异常, 需要将图片等比例缩小到适合手机屏幕分辨率, 再加载. 从gallery ...

  2. Android--操作图片Exif信息

    前言 在Android系统中,图片文件在内存中以像素点的二维数组加载,存放像素信息,还会在开头加上一些额外的照片拍摄参数信息,这些信息就是Exif.Android2.0之后,媒体库加入了操作图片Exi ...

  3. Android 获取图片exif信息

    使用android api读取图片的exif信息 布局代码: <LinearLayout xmlns:android="http://schemas.android.com/apk/r ...

  4. 七牛--关于图片上传方向不统一的问题--主要关于图片EXIF信息中旋转参数Orientation的理解

    [图片引用方向纠正]直接在图片后面添加 ?imageMogr/auto-orient eg:http://data.upfitapp.com/data/2016/10/18/1629114767606 ...

  5. 改动图片exif信息

    我们先了解一下EXIF: EXIF能够附加于JPEG.TIFF.RIFF等文件之中.为其添加有关数码相机拍摄信息的内容和索引图或图像处理软件的版本号信息. 全部的JPEG文件以字符串"0xF ...

  6. 图片Exif 信息中Orientation的理解和对此的处理

    这个问题是在用七牛上传图片后获取宽高时发现的,一张图片,用图片浏览器打开始终是竖图,但是查看属性或者用七牛获取宽高,却发现宽大于高,也就是在属性中这是个横图.这样导致客户端用该宽高来展示图片会出现问题 ...

  7. 七牛:关于图片 EXIF 信息中旋转参数 Orientation 的理解

    EXIF(Exchangeable Image File)是 “可交换图像文件” 的缩写,当中包含了专门为数码相机的照片而定制的元数据,可以记录数码照片的拍摄参数.缩略图及其他属性信息,简单来说,Ex ...

  8. 图片Exif信息

    Exif文件格式简述链接:https://www.zhihu.com/question/23727439/answer/25467748 可交换图像文件常被简称为Exif(Exchangeable i ...

  9. Java读取图片exif信息实现图片方向自动纠正

    起因 一个对试卷进行OCR识别需求,需要实现一个功能,一个章节下的题目图片需要上下拼接合成一张大图,起初写了一个工具实现图片的合并,程序一直很稳定的运行着,有一反馈合成的图片方向不对,起初怀疑是本身图 ...

随机推荐

  1. Java BIO、NIO、AIO-------转载

    先来个例子理解一下概念,以银行取款为例: 同步 : 自己亲自出马持银行卡到银行取钱(使用同步IO时,Java自己处理IO读写). 异步 : 委托一小弟拿银行卡到银行取钱,然后给你(使用异步IO时,Ja ...

  2. pip命令使用国内pypi镜像源加速在线安装

    参考:http://www.cnblogs.com/yudar/p/4444097.html 用easy_install和pip来安装第三方库很方便 它们的原理其实就是从Python的官方源pypi. ...

  3. 对torch的一点感想

    torch是一个基于LuaJIT的科学计算框架,知乎上有个人回答说torch比较适合科研用途, torch与matlab的很多函数很相似

  4. 2016年10月12日 星期三 --出埃及记 Exodus 18:23

    2016年10月12日 星期三 --出埃及记 Exodus 18:23 If you do this and God so commands, you will be able to stand th ...

  5. php 日期时间操作-可算出几天后的时间

    本文为大家介绍一下根据PHP时间戳获取当前时期的具体方式.strtotime能将任何英文文本的日期时间描述解析为Unix时间戳,我们结合mktime()或date()格式化日期时间获取指定的时间戳,实 ...

  6. Myeclipse 添加server library

    来自网络资料 (1)File->New->Other (2)弹出窗口勾上Show All Wizards,然后在type fiter text那里输入Server,选中server-> ...

  7. Intent官方教程(1)简介和作用

    Intents An Intent is a messaging object you can use to request an action from another app component. ...

  8. 没有必要去指定SqlSessionFactory或SqlSessionTemplate

    <!-- 自动注册mybatis mapper bean --><!-- 注意,没有必要去指定SqlSessionFactory或SqlSessionTemplate,     因为 ...

  9. iOS面试和招聘

    1, <招聘一个靠谱的iOS>面试题参考答案(上) 2, 招聘一个靠谱的 iOS

  10. Java程序员必备的6款最佳开发工具

    工欲善其事,必先利其器.每一个Java程序员都有其惯用的工具组件.对于Java程序员,各种有用的软件和工具泛滥成灾.初级开发人员要么找不到合适的工具,要么在寻找过程中浪费了大量的时间.下面,我将为大家 ...