android呼叫生圖片裁剪後圖片尺寸縮放的解決方法

NO IMAGE

在安卓開發中,如果對拍照後的圖片進行圖片裁剪,如果是呼叫系統的裁剪,如下:


/* 
* 裁剪圖片 
*/ 
private void cropPhoto() { 
Intent intent = new Intent("com.android.camera.action.CROP"); 
Uri uri = Uri.parse("file://"   picSavePath); 
intent.setDataAndType(uri, "image/*"); 
intent.putExtra("crop", "true"); 
// intent.putExtra("aspectX", 3); 
// intent.putExtra("aspectY", 2); 
intent.putExtra("outputX", cropX); 
intent.putExtra("outputY", cropY); 
intent.putExtra("scale", "true"); 
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri); 
intent.putExtra("return-data", "false"); 
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString()); 
intent.putExtra("noFaceDetection", "true"); // no face detection 
startActivityForResult(intent, CROP_PICTURE); 
} 

這樣,就開始對圖片進行裁剪了,但是這樣會有一個問題,當裁剪框選擇的圖片與錄入的cropX,xropY的形狀不同時,比如傳入的引數值是個w>h的長方形,而選擇框選擇的是w<h的長方形時,這樣會導致裁剪的圖片結果會被壓縮變形。

為了解決壓縮變形的問題,我的思路是這樣的:

1,先對圖片進行裁剪,不設定預設的裁剪圖片尺寸。

2.對裁剪後的圖片再進行圖片的縮放。縮放是採角的矩陣的方式進行的縮放

程式碼如下:

1.


/* 
* 裁剪圖片, 
*/ 
private void cropPhotoAndZoom() { 
Intent intent = new Intent("com.android.camera.action.CROP"); 
Uri uri = Uri.parse("file://"   picSavePath); 
intent.setDataAndType(uri, "image/*"); 
intent.putExtra("crop", "true"); 
intent.putExtra("scale", "true"); 
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri); 
intent.putExtra("return-data", "false"); 
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString()); 
intent.putExtra("noFaceDetection", "true"); // no face detection 
startActivityForResult(intent, CROP_PICTURE_ANDZOOM); 
} 

2.


/** 
* 裁剪後,根據裁剪框的長寬比,同時根據圖片的需求縮放尺寸進行縮放 
* 
* @param path 
* @param x 
*   原始的需求尺寸width 
* @param y 
*   heiht 
* @return 
*/ 
public static Bitmap toBigZoom(String path, float x, float y) { 
Log.e("bitmaputil", "path---"   path   "--x--y--"   x   "--"   y); 
Bitmap bitmap = BitmapFactory.decodeFile(path); 
if (bitmap != null) { 
int w = bitmap.getWidth(); 
int h = bitmap.getHeight(); 
float sx = 0; 
float sy = 0; 
if ((float) w / h >= 1) { 
sx = (float) y / w; 
sy = (float) x / h; 
Log.e("bitmaputil---", "w/h--->=1"); 
} else { 
sx = (float) x / w; 
sy = (float) y / h; 
Log.e("bitmaputil---", "w/h---<1"); 
} 
Matrix matrix = new Matrix(); 
matrix.postScale(sx, sy); // 長和寬放大縮小的比例 
Bitmap resizeBmp = Bitmap.createBitmap(bitmap, 0, 0, w, h, matrix, true); 
Log.e("bitmaputil---", "w---"   resizeBmp.getWidth()   "h--"   resizeBmp.getHeight()); 
return resizeBmp; 
} 
return null; 
} 

2中程式碼,通過判斷裁剪框的w,h比來設定圖片是放大是橫向放大,還是豎向放大,放大後的效果基本上能滿足需求。