前言——項目中須要用到對用戶頭像的裁剪和上傳功能。關於裁剪。一開始是想自己來做,可是認為這個東西應該谷歌有開發吧,於是一搜索官方文檔。果然有。於是。就果斷無恥地用了Android自帶有關於照片的自由裁剪。
因為時間太緊,盡管不太華麗,可是勝在能用,節省時間嘛。
詳細是通過 Intent的action來實現的。
關鍵代碼例如以下:
public void imageCut(Uri uri) {
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
//開啟裁剪功能
intent.putExtra("crop", "true");
//設定寬高的比例
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
//設定裁剪圖片寬高
intent.putExtra("outputX", 100);
intent.putExtra("outputY", 100);
//要求返回數據
intent.putExtra("return-data", true);
startActivityForResult(intent, 100);
}
返回數據后直接在onActivityResult里對返回的圖片數據進行顯示即可了,這里因為剪切后的圖片較小,個人認為應該不用考慮OOM的問題,問題是,在調用自帶的裁剪功能的時候,因為沒看源代碼,所以不知道在調整裁剪框的時候,顯示的那副圖片有沒有進行壓縮。假設沒有進行壓縮。那么當圖片非常大的時候,載入起來就非常easy出現OOM了。明顯對此因為是調用官方的API,我沒有方法去解決它。
唯一的辦法就是不用它。而是自己去寫一個,就能夠避免這個問題。
利用例如以下的代碼進行壓縮,非常好地避免OOM問題。
/*
* 壓縮圖片,返回的是壓縮后的照片
*/
public static Bitmap revitionImage(String path,int size){
Bitmap bitmap = null;
try {
//先用圖片路徑打開圖片文件,緩沖到一個緩存輸入流中
BufferedInputStream in = new BufferedInputStream(new FileInputStream(
new File(path)));
//用參數代表變量來記錄當前照片的信息,比方圖片大小
BitmapFactory.Options options = new BitmapFactory.Options();
//把inJustDecodeBounds設置為true,則全然不用分配內存就能夠得到給位圖文件bitmap的信息,
//如此得到大小后。就能夠對其進行7壓縮,然后在內存中生成一個更小的bitmap,節省了內存
options.inJustDecodeBounds = true;
//譯碼位圖文件。僅僅為了得到原圖的信息
BitmapFactory.decodeStream(in
,null,options);
//記得關閉流
in.close();
int i = 0;
while(true){
//右移i位是因為以下的pow取一半了,新生成的圖片是原來的二分之中的一個
if (((options.outWidth >> i)<=size) && ((options.outHeight >> i) <=size)) {
//這時候應取得照片了
in = new BufferedInputStream(new FileInputStream(new File(path)));
//pow是次方方法。2的i次方。inSampleSize圖片均分取樣值。比如
//inSampleSize == 4 returns an image that is 1/4 the width/height of the original, and 1/16 the number of pixels.
options.inSampleSize = (int)Math.pow(2.0, i);
//這時候的圖片已經符合我們設定的256大小了,所以要在設置false,同意輸出,創建圖片
//真正地生成一個有像素的,經過縮放的bitmap
options.inJustDecodeBounds = false;
bitmap = BitmapFactory.decodeStream(in,null,options);//獲得n分之中的一個原圖,小於256*256
break;
}else {
i++;
}
}
} catch (IOException e) {
Log.i(TAG, "壓縮圖片出錯"+e.toString());
}
return bitmap;
}
最后僅僅能先用着了。有時間再深究或者自己折騰一個。以下是效果圖,看着還行。
以下是一個關於本主題的DEMO。有須要的童鞋能夠去看看。