1. 程式人生 > >android 呼叫原生圖片裁剪後的圖片尺寸縮放

android 呼叫原生圖片裁剪後的圖片尺寸縮放

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

/*
	 * 裁剪圖片
	 */
	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比來設定圖片是放大是橫向放大,還是豎向放大,放大後的效果基本上能滿足需求。