需求:做仿新浪發微博的項目,能夠上傳圖片還有兩外一個項目用到手機拍攝圖片,這兩個都需要把圖片上傳到服務器
遇到問題:有的手機拍攝的圖片旋轉90度,有的圖片旋轉了180度,有的手機是正常的,服務器要求的是正的,這樣問題就來了,不能用戶發個照片在微博上看到的是被旋轉了的啊,另外一個項目裏旋轉了的圖片直接匹配出現問題,這個更嚴重。
解決:開始的時候在網上沒有找到很好的解決辦法,谷歌百度的搜了一通,想到第一種解決方式,當手機拍照結束,在返回結果處理裏面立即跳轉到一個新的頁面,在新的頁面裏讓用戶自己手動去旋轉圖片,然後點擊確定。就可以上傳到服務器正着的圖片了;第二種解決方式,這是在論壇裏發現的一個方法,可以獲取圖片的屬性,讀取圖片的旋轉角度。
第一種方式代碼:
在onActivityResult裏面處理跳轉
Intent intent = new Intent(SendMicoBlog.this, RotaingActivity.class);
MyApp myApp = (MyApp)getApplication();
myApp.setName(bitmap);//修改之後的名稱
myApp.setPhoto(isPhoto);
startActivityForResult(intent, 1);
在RotaingActivity裏面就可以作相應的旋轉處理了
//獲取bitmap
MyApp myApp = (MyApp)getApplication();
bitmap = myApp.getName();
System.out.println("RotaingActivity w = " + bitmap.getWidth() + "H = " + bitmap.getHeight());
myBitmap = bitmap;
myWidth = bitmap.getWidth();
myHeight = bitmap.getHeight();
// 創建操作圖片用的matrix對象
matrix = new Matrix();
Drawable drawable = ImageDispose.bitmapToDrawable(bitmap);
imageView.setBackgroundDrawable(drawable);
btnCancel.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
RotaingActivity.this.finish();
}
});
btnRightRotaing.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
myBitmap = rotaingImageView(-90);
}
});
btnLeftRotaing.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
myBitmap = rotaingImageView(+90);
}
});
btnOK.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
MyApp myApp = (MyApp)getApplication();
myApp.setName(myBitmap);//修改之後
System.out.println("OK resultcoder");
Intent intent = new Intent(RotaingActivity.this, SendMicoBlog.class);
setResult(6, intent);
RotaingActivity.this.finish();
}
});
}
private Bitmap rotaingImageView(int angle2) {
//旋轉圖片 動作
matrix.postRotate(angle2);
System.out.println("angle2=" + angle2);
// 創建新的圖片
Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0,
myWidth, myHeight, matrix, true);
Drawable drawable = ImageDispose.bitmapToDrawable(resizedBitmap);
imageView.setBackgroundDrawable(drawable);
return resizedBitmap;
}
第二種方式:就簡單多了,直接自己出偷着把照片給處理了,不需要用戶的操作,這樣體驗會更好一點。
在onActivityResult裏面處理
BitmapFactory.Options bitmapOptions = new BitmapFactory.Options();
bitmapOptions.inSampleSize = 8;
File file = new File(SD_CARD_TEMP_DIR);
/**
* 獲取圖片的旋轉角度,有些系統把拍照的圖片旋轉了,有的沒有旋轉
*/
int degree = ImageDispose.readPictureDegree(file.getAbsolutePath());
Bitmap cameraBitmap = BitmapFactory.decodeFile(SD_CARD_TEMP_DIR, bitmapOptions);
bitmap = cameraBitmap;
/**
* 把圖片旋轉爲正的方向
*/
bitmap = ImageDispose.rotaingImageView(degree, bitmap);
upload(bitmap);
/**
* 旋轉圖片
* @param angle
* @param bitmap
* @return Bitmap
*/
public static Bitmap rotaingImageView(int angle , Bitmap bitmap) {
//旋轉圖片 動作
Matrix matrix = new Matrix();;
matrix.postRotate(angle);
System.out.println("angle2=" + angle);
// 創建新的圖片
Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0,
bitmap.getWidth(), bitmap.getHeight(), matrix, true);
return resizedBitmap;
}
/**
* 讀取圖片屬性:旋轉的角度
* @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;
}
這樣就搞定了,此時你上傳的照片就是正的了。
第一種方式的圖片