利用MediaStore检索图像+利用ExitInterface修改EXIF信息

简介: 利用MediaStore检索图像+利用ExitInterface修改EXIF信息

利用MediaStore检索图像

由于ContentProvider(当前为MediaStore)在应用程序之间是共享的,且大多数应用程序默认使用MediaStore,因此可以利用它来建立自己的图像库应用程序。


MediaStore和所有的内容提供器都以一种类似数据库的方式运作。从它们中选择记录,获得一个Cursor对象,并通过它来遍历结果。


1.首先创建一个打算返回列的字符串数组。对于MediaStore中的图像,其标准列在MediaStore.Images.Media类表示。

String[] columns={Media.DATA,Media._ID,Media.TITLE,Media.DISPLAY_NAME};

2.使用activity的managedQuery方法执行查询,第一个参数是Uri,然后是列名称的数组,后跟WHERE子句和WHERE子句的任何参数,最后是ORDER BY子句。

long oneHourAgo=System.currentTimeMillis()/1000-(60*60);
String[] whereValues={""+oneHourAgo};
cursor=managedQuery(Media.EXTERNAL_CONTENT_URI,columns,Media.DATE_ADDED+" > ?",whereValues,Media.DATE_ADDED+" ASC");

3. 返回的游标会告诉我们当前选择的每个列的索引

displayColumn=cursor.getColumnIndexOrThrow(Media.DISPLAY_NAME);

示例代码:

public class MediaStoreGallery extends Activity
{
  public final static int DISPLAYWIDTH=200;
  public final static int DISPLAYHEIGHT=200;
  TextView titleTextView;
  ImageButton imageButton;
  Cursor cursor;
  Bitmap bmp;
  String imageFilePath;
  int fileColumn;
  int titleColumn;
  int displayColumn;
  @Override
  protected void onCreate(Bundle savedInstanceState)
  {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    titleTextView=(TextView)this.findViewById(R.id.TitleTextView);
    imageButton=(ImageButton)this.findViewById(R.id.ImageButton);
    String[] columns={Media.DATA,Media._ID,Media.TITLE,Media.DISPLAY_NAME};
    cursor=managedQuery(Media.EXTERNAL_CONTENT_URI,columns,null,null,null);
//    long oneHourAgo=System.currentTimeMillis()/1000-(60*60);
//    String[] whereValues={""+oneHourAgo};
//    cursor=managedQuery(Media.EXTERNAL_CONTENT_URI,columns,
//        Media.DATE_ADDED+" > ?",whereValues,Media.DATE_ADDED+" ASC");
    fileColumn=cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
    titleColumn=cursor.getColumnIndexOrThrow(Media.TITLE);//可简写成
    displayColumn=cursor.getColumnIndexOrThrow(Media.DISPLAY_NAME);
    if(cursor.moveToFirst())
    {
      titleTextView.setText(cursor.getString(titleColumn));
      imageFilePath=cursor.getString(fileColumn);
      bmp=getBitmap(imageFilePath);
      imageButton.setImageBitmap(bmp);
    }
    imageButton.setOnClickListener(new OnClickListener()
    {
      @Override
      public void onClick(View v)
      {
        // TODO Auto-generated method stub
        if(cursor.moveToNext())
        {
          titleTextView.setText(cursor.getString(titleColumn));
          imageFilePath=cursor.getString(fileColumn);
          bmp=getBitmap(imageFilePath);
          imageButton.setImageBitmap(bmp);
        }
      }
    });
  }
  private Bitmap getBitmap(String imageFilePath)
  {
//    加载图像的尺寸而不是图像本身
      BitmapFactory.Options bmpFactoryOptions=new BitmapFactory.Options();
      bmpFactoryOptions.inJustDecodeBounds=true;
      Bitmap bmp=BitmapFactory.decodeFile(imageFilePath, bmpFactoryOptions);
      int heightRatio=(int)Math.ceil(bmpFactoryOptions.outHeight/(float)dh);
      int widthRatio=(int)Math.ceil(bmpFactoryOptions.outWidth/(float)dw);
      Log.v("HEIGHT RATIO",""+heightRatio);
      Log.v("WIDTH RATIO",""+widthRatio);
//    如果两个比率都大于1,那么图像的一条边将大于屏幕
      if(heightRatio>1&&widthRatio>1)
      {
        if(heightRatio>widthRatio)
        {
//        如果高度比率更大,则根据它缩放
          bmpFactoryOptions.inSampleSize=heightRatio;
        }
        else
        {
//        若宽度比率更大,则根据它缩放
          bmpFactoryOptions.inSampleSize=widthRatio;
        }
      }
//    对它进行真正的解码
      bmpFactoryOptions.inJustDecodeBounds=false;
      bmp=BitmapFactory.decodeFile(imageFilePath, bmpFactoryOptions);
      return bmp;   
  }
}

利用ExitInterface修改EXIF信息

1.EXIF 表示可交换的图像文件格式,它是在图像文件中保存元数据的一种标准方式。一般大多数标记与所捕获图像本身的数据相关,如ExposureTime和ShutterSpeedValue。


然而,有一些标记可以考虑填写或修改。


UserComment:由用户生成的备注


ImageDescription:标题


Artist:图像的创建者或接受者


Copyright:图像的版权持有人


Software:用于创建图像的软件


Android为我们提供了一种读写EXIF数据的方法,该方法的主要类是ExifInterface。


示例代码:

//如何使用ExifInterface从一个图像文件读取特定的EXIF数据
ExifInterface ei=new ExifInterface(imageFilePath);
String imageDescription=ei.getAttribute("ImageDescription");
if(imageDescription!=null)
{
  Log.v("EXIF",imageDescription);
}
//如何使用ExifInterface将EXIF数据保存到图像文件中
ei.setAttribute("ImageDescription","Something New");


目录
相关文章
|
9月前
|
人工智能 自然语言处理 API
图片转音乐模型来了!Image to Music V2 :只需上传一张照片,自动转换成与图片内容匹配的音频!
图片转音乐模型来了!Image to Music V2 :只需上传一张照片,自动转换成与图片内容匹配的音频!
404 1
|
存储 编解码 Java
图片Exif信息解析(Java实现)
图片Exif信息解析(Java实现)
|
8月前
|
编解码 计算机视觉 异构计算
【CV大模型SAM(Segment-Anything)】如何一键分割图片中所有对象?并对不同分割对象进行保存?
【CV大模型SAM(Segment-Anything)】如何一键分割图片中所有对象?并对不同分割对象进行保存?
|
4月前
|
定位技术
|
7月前
|
编解码 定位技术
【工具分享】如何批量获取图片详细信息,如何把图片的属性信息包括文件路径、文件名、面积尺寸、创建日期、修改日期、水平垂直分辨率、文件大小等图片信息批量提取exel表格中
本文介绍了如何批量提取图片的属性数据到Excel,包括文件名、尺寸、面积、分辨率、GPS信息、创建和修改日期。适合需要处理大量图片信息的工作场景。支持批量导入图片,一键提取各项信息,并能直接导出为表格。
1033 0
|
9月前
|
XML 定位技术 数据格式
JPEG图像EXIF数据信息的解析
JPEG图像EXIF数据信息的解析
196 0
|
数据可视化 数据挖掘
图片主色提取
图片主色提取
388 0
图片主色提取
SwiftUI—使用Image图像视图显示项目中的图片
SwiftUI—使用Image图像视图显示项目中的图片
674 0
SwiftUI—使用Image图像视图显示项目中的图片
|
前端开发
前端获取图片exif流信息
如果你是为了获取 exif 解析后的信息,那么你可以看这篇 前端获取图片exif信息,通过 exif-js 来获取的。 看到这里你要懵了,我为什么又要写一遍。emmmm...因为我需求变了,直接拿到 exif 部分的数据,然后 base64 提交。测试地址
528 0
前端获取图片exif流信息
|
前端开发 JavaScript 定位技术
前端获取图片exif信息
对又是我,每天都有新的需求。 这次的需求是上传图片的时获取图片的宽高、设备、光圈等信息。 不用考虑服务端做,他们肯定是不做。 pc、android、ios 都支持了,现在就缺少 web 这边上传的图片了。 上测试地址:https://www.lilnong.top/static/html/exif.html
247 0
前端获取图片exif信息