天天看點

Android 根據角度旋轉圖檔



        在Android開發過程中,幾乎每個應用都會或多或少的涉及到對圖檔的處理。經常遇到的一個情況就是,取得的圖檔是橫着的,而實際需要的圖檔是正着的,也就是豎着的。這裡就涉及到對圖檔橫堅情況的判斷,也就是圖檔的目前的角度。然後根據角度來糾正,得到想要的圖檔。

       在Android的源代碼裡提供了一個專門讀寫圖檔資訊的類ExifInterface,官方給出的注釋為:This is a class for reading and writing Exif tags in a JPEG file ,可見ExifInterface是專門用來讀寫JPEG圖檔檔案Exif資訊的類。

        Exif資訊裡面就包括了角度,GPS經緯度,白平衡,閃光燈等資訊。ExifInterface的用法相對簡單,隻有一個帶參的構造方法,将圖檔檔案位址傳過去就可以了。類裡提供了getAttribute方法來取得各種屬性,當得也可以用setAttribute方法來為已存在的圖檔設定或修改其本來屬性。

       下面貼上代碼:

/**
	 * 讀取圖檔屬性:旋轉的角度
	 * @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();
			return degree;
		}
		return degree;
	}
           

         能過以上方法得到圖檔角度後,就可以通過Matrix類對圖檔進行糾正了,還是貼上完整的代碼,如下:

/**
	 * 旋轉圖檔,使圖檔保持正确的方向。
	 * @param bitmap 原始圖檔
	 * @param degrees 原始圖檔的角度
	 * @return Bitmap 旋轉後的圖檔
	 */
	public static Bitmap rotateBitmap(Bitmap bitmap, int degrees) {
		if (degrees == 0 || null == bitmap) {
			return bitmap;
		}
		Matrix matrix = new Matrix();
		matrix.setRotate(degrees, bitmap.getWidth() / 2, bitmap.getHeight() / 2);
		Bitmap bmp = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
		if (null != bitmap) {
			bitmap.recycle();
		}
		return bmp;
	}
           

        通過以上兩個步驟,就可以得到一個正着的圖檔了。當然中間省略了一步:

Bitmap bmp =BitmapFactory.decodeFile(imageFilePath);
           

繼續閱讀