這兩天在作項目時,作到上傳圖片功能一塊時,碰到兩個問題,一個是如何獲取所選圖片的路徑,一個是如何壓縮圖片,在查了一些資料和看了別人寫的後總算折騰出來了,在此記錄一下。android
首先既然要選擇圖片,咱們就先要獲取本地全部的圖片,Android已經爲咱們封裝好了該意圖。數據庫
1 Intent intent = new Intent(Intent.ACTION_PICK, null);//從列表中選擇某項並返回全部數據 2 intent.setDataAndType( 3 MediaStore.Images.Media.EXTERNAL_CONTENT_URI,//獲得系統全部的圖片 4 "image/*");//圖片的類型,image/*爲全部類型圖片 5 startActivityForResult(intent, PHOTO_GALLERY);
而後咱們重寫onActivityResult方法。ide
在Android1.5後系統會調用MediaScanner服務進行後臺掃描,索引歌曲,圖片,視頻等信息,並將數據保存在android.provider.MediaStore.Images.Thumbnails 和android.provider.MediaStore.Video.Thumbnails這兩個數據庫中。工具
因此咱們須要使用Activity.managedQuery(uri, projection, selection, selectionArgs, sortOrder)方法從數據中獲取相應數據。spa
uri: 須要返回的資源索引
projection: 用於標識有哪些數據須要包含在返回數據中。
selection: 做爲查詢符合條件的過濾參數,相似於SQL語句中Where以後的條件判斷。
selectionArgs: 同上。
sortOrder: 對返回信息進行排序。code
1 @Override 2 protected void onActivityResult(int requestCode, int resultCode, Intent data) 3 { 4 switch (requestCode) 5 { 6 //請求爲獲取本地圖品時 7 case PHOTO_GALLERY: 8 { 9 //圖片信息需包含在返回數據中 10 String[] proj ={MediaStore.Images.Media.DATA}; 11 //獲取包含所需數據的Cursor對象 12 @SuppressWarnings("deprecation") 13 Cursor cursor = managedQuery(data.getData(), proj, null, null, null); 14 //獲取索引 15 int photocolumn = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 16 //將光標一直開頭 17 cursor.moveToFirst(); 18 //根據索引值獲取圖片路徑 19 String path = cursor.getString(photocolumn); 20 21 22 break; 23 } 24 25 default: 26 break; 27 }
以上,咱們即可取得本地圖片路徑了,接下來咱們隊圖片進行壓縮處理。orm
1 //先將所選圖片轉化爲流的形式,path所獲得的圖片路徑 2 FileInputStream is = new FileInputStream(path); 3 //定義一個file,爲壓縮後的圖片 4 File f = new File("圖片保存路徑","圖片名稱"); 5 int size = " "; 6 Options options = new Options(); 7 options.inSampleSize = size; 8 //將圖片縮小爲原來的 1/size ,否則圖片很大時會報內存溢出錯誤 9 Bitmap image = BitmapFactory.decodeStream(inputStream,null,options); 10 11 is.close(); 12 13 ByteArrayOutputStream baos = new ByteArrayOutputStream(); 14 image.compress(Bitmap.CompressFormat.JPEG, 100, baos);//這裏100表示不壓縮,將不壓縮的數據存放到baos中 15 int per = 100; 16 while (baos.toByteArray().length / 1024 > 500) { // 循環判斷若是壓縮後圖片是否大於500kb,大於繼續壓縮 17 baos.reset();// 重置baos即清空baos 18 image.compress(Bitmap.CompressFormat.JPEG, per, baos);// 將圖片壓縮爲原來的(100-per)%,把壓縮後的數據存放到baos中 19 per -= 10;// 每次都減小10 20 21 } 22 //回收圖片,清理內存 23 if(image != null && !image.isRecycled()){ 24 image.recycle(); 25 image = null; 26 System.gc(); 27 } 28 ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());// 把壓縮後的數據baos存放到ByteArrayInputStream中 29 btout.close(); 30 FileOutputStream os; 31 os = new FileOutputStream(f); 32 //自定義工具類,將輸入流複製到輸出流中 33 StreamTransferUtils.CopyStream(btinput, os); 34 btinput.close(); 35 os.close();
完成之後,咱們能夠在指定的圖片保存路徑下看到壓縮的圖片。視頻