zoukankan      html  css  js  c++  java
  • Android 图片Exif信息相关的获取与修改

    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 + "
    ");
          text.append("方向---" + Orientation + "
    ");
          text.append("时间日期---" + DateTime + "
    ");
          text.append("设备制造商---" + Make + "
    ");
          text.append("设备型号---" + Model + "
    ");
          text.append("闪光灯---" + Flash + "
    ");
          text.append("图片宽---" + ImageWidth + "
    ");
          text.append("图片长---" + ImageLength + "
    ");
          text.append("曝光时间---" + ExposureTime + "
    ");
          text.append("光圈值---" + FNumber + "
    ");
          text.append("ISOSpeedRatings---" + ISOSpeedRatings + "
    ");
          
          exifInterface.setAttribute("mytag", "test");
          text.append("mytag---" + exifInterface.getAttribute("mytag") + "
    ");
          
        } catch (Exception e) {
          e.printStackTrace();
        }
    
        show.setText(text);
        
      }
    
      
    }

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

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

  • 相关阅读:
    bitcoin PoW原理及区块创建过程
    Hyperledger Fabric(v1.1.0)编译时遇到的问题
    Hyperledger Fabic中的Transaction流程
    mint linux 18.3 遇到“已安装的 post-installation 脚本 返回了错误号 127 ”问题的解决
    redis--解析字符串
    golang 统计uint64 数字二进制存储中1的数量
    c++ std 最小堆的使用 (用于实现top100之类的功能)
    Linux 信号signal处理函数
    Linux 信号signal处理机制
    LinuxMint 下 B站 番 blv 缓存 转 mp4
  • 原文地址:https://www.cnblogs.com/huanyi0723/p/5075741.html
Copyright © 2011-2022 走看看