處理相機拍照後Bitmap和圖片旋轉問題

在調用系統相機,拍照並保存在sdcard上後,有些圖片是旋轉過的,如何將他們再轉回來了,我做了如下操作:

1.首先看圖片的屬性到底是旋轉了多少度

/**
	 * 讀取圖片屬性:旋轉的角度
	 * 
	 * @param path
	 *            圖片絕對路徑
	 * @return degree旋轉的角度
	 */
	public static int readPictureDegree(String path) {
		int degree = 0;
		try {
			ExifInterface exifInterface = new ExifInterface(path);
			int orientation = exifInterface.getAttributeInt(
					ExifInterface.TAG_ORIENTATION,
					ExifInterface.ORIENTATION_NORMAL);
			switch (orientation) {
			case ExifInterface.ORIENTATION_ROTATE_90:
				degree = 90;
				break;
			case ExifInterface.ORIENTATION_ROTATE_180:
				degree = 180;
				break;
			case ExifInterface.ORIENTATION_ROTATE_270:
				degree = 270;
				break;
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		System.out.println("圖片旋轉了:" + degree + " 度");
		return degree;
	}

2.其次讀取sdcard上的圖片文件,然後動態設置縮放比例,再將旋轉了的圖片再轉回來,最後輸出圖片覆蓋原來的圖片

BitmapFactory.Options options = new BitmapFactory.Options();
		options.inJustDecodeBounds = true;// 爲true的情況下decodeFile並不分配空間,但可計算出原始圖片的長度和寬度
		// 獲取這個圖片的寬和高
		bitmap = BitmapFactory.decodeFile(imagePath, options); // 此時返回bm爲空
		options.inSampleSize = calculateInSampleSize(options, 150, 150);
		// 重新讀入圖片,注意這次要把options.inJustDecodeBounds 設爲 false
		options.inJustDecodeBounds = false;
		bitmap = BitmapFactory.decodeFile(imagePath, options);
		//如果圖片旋轉了,就給他轉回來
		if(degree!=0){
			bitmap = UtilTool.rotaingImageView(degree,bitmap);
		}
		FileOutputStream out;
		try {
			out = new FileOutputStream(new File(Constant.SDCARD_ROOT_PATH
					+ Constant.SAVE_PATH_IN_SDCARD + IMAGE_CAPTURE_NAME));
			bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}

動態設置縮放比例

public static int calculateInSampleSize(BitmapFactory.Options options,
			int reqWidth, int reqHeight) {
		final int height = options.outHeight;
		final int width = options.outWidth;
		int inSampleSize = 1;
		if (height > reqHeight || width > reqWidth) {
			final int heightRatio = Math.round((float) height
					/ (float) reqHeight);
			final int widthRatio = Math.round((float) width / (float) reqWidth);
			inSampleSize = heightRatio < widthRatio ? widthRatio : heightRatio;
		}
		return inSampleSize;
	}

圖片旋轉

public static Bitmap rotaingImageView(int angle, Bitmap bitmap) {
		// 旋轉圖片 動作
		Matrix matrix = new Matrix();
		matrix.postRotate(angle);
		// 創建新的圖片
		Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0,
				bitmap.getWidth(), bitmap.getHeight(), matrix, true);
		return resizedBitmap;
	}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章