android調用系統的自定義裁剪后得到的圖片不清晰,使用MediaStore.EXTRA_OUTPUT獲取緩存下的清晰圖片


在使用系統自帶的剪切圖片工具時,通常只能設置一些比較小的值,像

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM