Android 图片Exif信息相关的获取与修改

余生长醉 提交于 2019-12-29 01:06:21

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

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!