在調用系統相機,拍照並保存在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;
}