在使用系統自帶的剪切圖片工具時,通常只能設置一些比較小的值,像
intent.putExtra("outputX", 320);
intent.putExtra("outputY", 320);
剪切后圖片的尺寸不能設置為過大,經測試到480就會出現卡住的現象,為什么呢?
原因是在於Intent 的data域最大傳遞的值的大小約為1M,所以圖片的BITMAP當超過1M時就會失敗。通常我們只是設置頭像可以用這個方法,那么如果我們要剪切顯示一些比較大的圖片呢?怎么做呢?
該方法就是先設置為return-data設為false,不從data域獲取圖片,而是越過這個橋梁,通過我們剛剛在剪切圖片后設置的路徑目錄和名稱來單獨獲取這個圖片,就可以完美顯示了。如果不設置return-data為false,那么就會默認通過data返回,從而造成卡住現像。
return-data:是將結果保存在data中返回,在onActivityResult中,直接調用intent.getdata()就可以獲取值了,這里設為fase,就是不讓它保存在data中MediaStore.EXTRA_OUTPUT:由於我們不讓它保存在Intent的data域中,但我們總要有地方來保存我們的圖片,這個參數就是轉移保存地址的,對應Value中保存的URI就是指定的保存地址。
利用MediaStore.EXTRA_OUTPUT,就可以規避Intent攜帶信息的不靠譜所造成的吃飯不香。那么具體怎樣使用呢——
1 protected void onActivityResult(int requestCode, int resultCode, Intent data) { 2 3 switch (requestCode){ 4 case RESULT_CANCELED: 5 ToastUtil.showCenter(R.string.cancel); 6 return; 7 case 111://獲取到圖片后發送的requestCode,然后現在開始剪切 8 if (USER_ICON.exists()){ 9 photoClip(Uri.fromFile(USER_ICON), 1, this); 10 11 } 12 break; 13 14 case 1://剪切成功后的返回 15 Bitmap bitmap = null; 16 try { 17 bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(tempPhotoUri)); 18 //取出bitmap即可 19 break; 20 21 } 22 super.onActivityResult(requestCode, resultCode, data); 23 } 24 25 public void photoClip(Uri uri, int requestCode, Activity a) { 26 Intent intent = new Intent();//調用系統自帶的圖片裁剪 27 intent.setAction("com.android.camera.action.CROP"); 28 intent.setDataAndType(uri, "image/*"); 29 intent.putExtra("crop", "true");//設置在開啟的Intent中設置顯示的VIEW可裁剪 30 intent.putExtra("aspectX", 16);//寬高比 31 intent.putExtra("aspectY", 9); 32 intent.putExtra("outputX", 1080); 33 intent.putExtra("outputY", 720); 34 intent.putExtra("return-data", false);//return置為false,獲取截圖保存的uri 35 intent.putExtra(MediaStore.EXTRA_OUTPUT, getTempUri()); 36 intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString()); 37 intent.putExtra("noFaceDetection", true); 38 a.startActivityForResult(intent, requestCode); 39 } 40 41 Uri tempPhotoUri; 42 private Uri getTempUri() { 43 tempPhotoUri = Uri.fromFile(getTempFile()); 44 return tempPhotoUri; 45 } 46 47 private File getTempFile() { 48 if (FileUtils.envIsOk) {//這里只是個判斷SD卡有效的方法 49 String dir = FileUtils.strSDPath + FileUtils.appName + FileUtils.BMP; 50 FileUtils.createDir(dir); 51 File f = new File(dir,"temp.jpg"); 52 try { 53 f.createNewFile(); 54 } catch (IOException e) { 55 e.printStackTrace(); 56 } 57 return f; 58 } 59 return null; 60 }
附上裁剪屬性表:
附加選項 | 數據類型 | 描述 |
crop | String | 發送裁剪信號 |
aspectX | int | X方向上的比例 |
aspectY | int | Y方向上的比例 |
outputX | int | 裁剪區的寬 |
outputY | int | 裁剪區的高 |
scale | boolean | 是否保留比例 |
return-data | boolean | 是否將數據保留在Bitmap中返回 |
data | Parcelable | 相應的Bitmap數據 |
circleCrop | String | 圓形裁剪區域? |
MediaStore.EXTRA_OUTPUT ("output") | URI | 將URI指向相應的file:///...,詳見代碼示例 |
outputFormat | String | 輸出格式,一般設為Bitmap格式:Bitmap.CompressFormat.JPEG.toString() |
noFaceDetection | boolean | 是否取消人臉識別功能 |
參考:http://blog.csdn.net/augusaccount/article/details/54890169
http://www.cppblog.com/ctou45/archive/2013/02/20/197947.aspx