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

网友投稿 609 2022-05-30

利用MediaStore检索图像

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

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

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

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

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");

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)

{

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

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");

Android

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:软通动力成为华为云“同舟共济”合作伙伴,合力推进政府和企业上云
下一篇:Java基础String、StringBuilder类
相关文章