android手機拍照後上傳圖片被旋轉的問題
阿新 • • 發佈:2019-02-07
原貼子連結: http://blog.csdn.net/walker02/article/details/8211628/,謝謝點選開啟連結
遇到問題:有的手機拍攝的圖片旋轉90度,有的圖片旋轉了180度,有的手機是正常的,伺服器要求的是正的,這樣問題就來了,不能使用者發個照片在微博上看到的是被旋轉了的啊,另外一個專案裡旋轉了的圖片直接匹配出現問題,這個更嚴重。
解決:開始的時候在網上沒有找到很好的解決辦法,谷歌百度的搜了一通,想到第一種解決方式,當手機拍照結束,在返回結果處理裡面立即跳轉到一個新的頁面,在新的頁面裡讓使用者自己手動去旋轉圖片,然後點選確定。就可以上傳到伺服器正著的圖片了;第二種解決方式,這是在論壇裡發現的一個方法,可以獲取圖片的屬性,讀取圖片的旋轉角度。
第一種方式程式碼:
在onActivityResult裡面處理跳轉
- <span style="font-size:18px;"> Intent intent = new Intent(SendMicoBlog.this, RotaingActivity.class);
- MyApp myApp = (MyApp)getApplication();
- myApp.setName(bitmap);//修改之後的名稱
- myApp.setPhoto(isPhoto);
- startActivityForResult(intent, 1
在RotaingActivity裡面就可以作相應的旋轉處理了
- <span style="font-size:18px;"> //獲取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
- publicvoid onClick(View v) {
- RotaingActivity.this.finish();
- }
- });
- btnRightRotaing.setOnClickListener(new OnClickListener() {
- @Override
- publicvoid onClick(View v) {
- myBitmap = rotaingImageView(-90);
- }
- });
- btnLeftRotaing.setOnClickListener(new OnClickListener() {
- @Override
- publicvoid onClick(View v) {
- myBitmap = rotaingImageView(+90);
- }
- });
- btnOK.setOnClickListener(new OnClickListener() {
- @Override
- publicvoid 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;
- }</span>
第二種方式:就簡單多了,直接自己出偷著把照片給處理了,不需要使用者的操作,這樣體驗會更好一點。
在onActivityResult裡面處理
- BitmapFactory.Options bitmapOptions = new BitmapFactory.Options();
- bitmapOptions.inSampleSize = 8;
- File file = new File(SD_CARD_TEMP_DIR);
- /**
- * 獲取圖片的旋轉角度,有些系統把拍照的圖片旋轉了,有的沒有旋轉
- */
- int degree = ImageDispose.readPictureDegree(file.getAbsolutePath());
- <span style="font-size:18px;">Bitmap cameraBitmap = BitmapFactory.decodeFile(SD_CARD_TEMP_DIR, bitmapOptions);
- bitmap = cameraBitmap;
- /**
- * 把圖片旋轉為正的方向
- */
- bitmap = ImageDispose.rotaingImageView(degree, bitmap);
- upload(bitmap);</span>
- <span style="font-size:18px;"> /**
- * 旋轉圖片
- * @param angle
- * @param bitmap
- * @return Bitmap
- */
- publicstatic 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;
- }</span>
- /**
- * 讀取圖片屬性:旋轉的角度
- * @param path 圖片絕對路徑
- * @return degree旋轉的角度
- */
- publicstaticint 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;
- }