1. 程式人生 > >Android手機拍照後照片被旋轉或者需要旋轉的問題

Android手機拍照後照片被旋轉或者需要旋轉的問題

1、讀取圖片的旋轉屬性

/** * 讀取圖片的旋轉的角度 * * @param path *            圖片絕對路徑 * @return 圖片的旋轉角度 */ private int getBitmapDegree(String path) { int degree = 0; try { // 從指定路徑下讀取圖片,並獲取其EXIF資訊 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();
} return degree; }
	/**
	 * 將圖片按照某個角度進行旋轉
	 *
	 * @param bm
	 *            需要旋轉的圖片
	 * @param degree
	 *            旋轉角度
	 * @return 旋轉後的圖片
	 */
	public static Bitmap rotateBitmapByDegree(Bitmap bm, int degree) {
	    Bitmap returnBm = null;
	  
	    // 根據旋轉角度,生成旋轉矩陣
	    Matrix matrix = new Matrix();
	    matrix.postRotate(degree);
	    try {
	        // 將原始圖片按照旋轉矩陣進行旋轉,並得到新的圖片
	        returnBm = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), bm.getHeight(), matrix, true);
	    } catch (OutOfMemoryError e) {
	    }
	    if (returnBm == null) {
	        returnBm = bm;
	    }
	    if (bm != returnBm) {
	        bm.recycle();
	    }
	    return returnBm;
	}

在部分Android手機(如MT788、Note2)上,使用Camera拍照以後,得到的照片會被自動旋轉(90°、180°、270°),這個情況很不符合預期。仔細分析了一下,因為照片屬性中是儲存了旋轉資訊的,所以要解決這個問題,可以在onActivityResult方法中,獲取到照片資料後,讀取它的旋轉資訊,如果不是0,說明這個照片已經被旋轉過了,那麼再使用android.graphics.Matrix將照片旋轉回去即可。
我的程式碼中使用了這個方法:
// 為防止原始圖片過大導致記憶體溢位,這裡先縮小原圖顯示,然後釋放原始Bitmap佔用的記憶體,變成65px
					Bitmap smallBitmap = UploadImageTools.zoomBitmap(photo,image_px, image_py);
					//smallBitmap = rotateBitmapByDegree(smallBitmap,90);
					// 壓縮圖片,得到base64str ,用於上傳到伺服器
					ll_com_cover.setImageBitmap(smallBitmap);// 圖片選擇 那個位置的檢視改成
																// 當前使用者選擇的圖片
					ll_com_cover.setOnClickListener(new ImageDeleteListener());// 設定圖片刪除事件,使用者上傳了一張照片,可以很快就刪除,重新選擇
					//photo = rotateBitmapByDegree(photo,90);
					base64ImgStr = UploadImageTools.BitmapToBase64Str2(photo);// 把要上傳的圖片轉換成為64位碼
					// 預覽成功之後 馬上把圖片傳送給伺服器

但是最後還是沒有使用,放棄了, 決定還是搞個預覽功能,並且支援旋轉,由使用者自己來決定到底是選擇 豎著的還是橫著的 文章未完,敬請期待