利用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};
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)
{
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小時內刪除侵權內容。