1. 程式人生 > >解決android有的手機拍照後上傳圖片被旋轉的問題

解決android有的手機拍照後上傳圖片被旋轉的問題

需求:做仿新浪發微博的專案,能夠上傳圖片還有兩外一個專案用到手機拍攝圖片,這兩個都需要把圖片上傳到伺服器

遇到問題:有的手機拍攝的圖片旋轉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;
    }

這樣就搞定了,此時你上傳的照片就是正的了。

第一種方式的圖片


相關推薦

解決android有的手機拍照圖片旋轉的問題

需求:做仿新浪發微博的專案,能夠上傳圖片還有兩外一個專案用到手機拍攝圖片,這兩個都需要把圖片上傳到伺服器 遇到問題:有的手機拍攝的圖片旋轉90度,有的圖片旋轉了180度,有的手機是正常的,伺服器要求的是正的,這樣問題就來了,不能使用者發個照片在微博上看到的是被旋轉了的啊,另

android手機拍照圖片旋轉的問題

原貼子連結: http://blog.csdn.net/walker02/article/details/8211628/,謝謝點選開啟連結 遇到問題:有的手機拍攝的圖片旋轉90度,有的圖片旋轉了180度,有的手機是正常的,伺服器要求的是正的,這樣問題就來了,不能使用者發

Android 解決部分手機拍照獲取的圖片旋轉的問題

最近又被測試MM找茬了,呼叫Android系統拍照功能後,三星手機拍攝後的照片被旋轉了90度,橫著拍給你變成豎的,豎的拍給你變成橫的。。。其它品牌的手機都是正常的,就三星出現這個怪事。 在Android適配上,我原來一直以為國內的小米手機夠奇葩了,結果還有更奇葩的!你說你沒

Android開發:解決三星裝置拍照獲取的圖片旋轉的問題

呼叫Android系統拍照功能後,三星手機拍攝後的照片被旋轉了90度,橫著拍變成豎的,豎著拍變成橫的。。。測試其它品牌的手機是正常的,就三星出現這個問題。 解決方法: 1、首先在呼叫拍照方法時,儲存拍照後的相片原圖,得到原圖路徑,(PhotoBitmapUtils是我

html手機拍照

手機如何實現拍照和上傳圖片? <input type="file">的accept 屬性 <!-- 選擇照片 --> <input type=file accept="image/*"> <!-- 選擇視訊 -->

前端把圖片轉為base64,解決手機圖片自動旋轉的問題

使用這個首先要下載exif.js。jsp頁面引用這個js,下載連結:https://link.jianshu.com?t=http://code.ciaoca.com/javascript/exif-js/jsp部分:上傳圖片:<input type="file" ac

Android 呼叫本地相機拍照圖片

1、呼叫本地相機拍照並上傳圖片 Intent cameraIntent = new Intent( "android.media.action.IMAGE_CAPTURE"); startActivityForResult(cameraIntent, m

Android Retrofit 2.0框架圖片解決方案(一張與多張的處理)

1.單張圖片的上傳 /** * 上傳一張圖片 * @param description * @param imgs * @return */ @Mul

解決Android 呼叫相機拍照得到的照片不清晰問題

最近在做一個需要上傳拍照的APP,上傳的時候因為是小圖片,但是需求提了要點選可預覽大圖,一看大圖,被嚇到了,根本看不清楚,大圖中的具體內容。原因是通過MediaStore.ACTION_IMAGE_CAPTURE方式直接去呼叫相機,在onactivityr

部分vivo和oppo手機,使用圖片功能,可能會出現退出webview的現象(回退到app的入口頁面)

在公司的app裡面嵌入了一個h5頁面,h5頁面有個使用圖片上傳功能,上傳圖片出現閃退的現象  問題描述: vivo手機,在app內的wap頁面使用上傳圖片的功能,在選擇好圖片點選確認按鈕後,出現退出整個webview,回退到app該wap頁面的入口頁面,且app自動重新整理了該入口頁面

小蜂窩徹底解決ewebeditor網站後臺不能圖片的方法

經我們技術員檢查,結果原來是eWebEditor文字編輯器對IE8瀏覽器的相容性導致的指令碼錯誤,並不是什麼“網站空間、伺服器中毒、出問題了”呢! 現就將解決方法公佈給大家,方便大家修正自己網站的程式碼以使文字編輯器在各種瀏覽器下都能相容、正常使用! 解決IE8

安卓實現拍照圖片以及剪下圖片

效果圖: 總結一下專案實現的選擇圖片、拍照、以及剪下圖片,再加一下圖片壓縮,上傳到伺服器等功能 網上有好多關於圖片上傳、拍照的方法,我這只是自己專案的一種方式,之前部落格也是總結過圖集上傳,裡面也包含圖片上傳,拍照的相關程式碼,在這我單獨拿出來總結一下,還有關於呼叫系統

Android webview與js互動圖片

最近專案中用到webview,並且有上傳圖片功能,iOS不用做任何處理,但Android就不行了,調不到相簿,後百度才知道這是Android webview的侷限性,需要自己擴充套件WebChromeClient來實現,話不多說直接上程式碼: 第一步:擴充套件WebChro

Android呼叫相機拍照,壓縮圖片

1、直接onActivityResult裡 ,從Intent data引數中可以取出拍照後縮圖,基本不需要壓縮的。 2、是設定儲存路徑,然後拍完之後直接讀取該路徑的圖片: Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); Str

微信內網頁某些安卓手機不能圖片檔案的問題(1)

最近的一個專案是微信公眾號關聯的網站,自然用新技術HTML5 了。 在某個手機發布資訊的頁面中,卻碰到了一個詭異的問題。 在某些安卓手機上無法使用上傳圖片功能,你怎麼點都沒用。 微信並沒有對type=file做任何特殊處理。但是在Android 4.4.1/4.4.2系統中

android中以檔案形式圖片到後臺

private File tuPian1 ; private File tuPian2 ; @Override protected void onActivityResult(int requestCode, int resultCode, Intent intent) {

【完】html5手機 input file 圖片 呼叫API

<input type="file" accept="video/*;capture=camcorder"> <input type="file" accept="audio/*;capture=microphone"><input type="

真正解決百度編輯器UEditor圖片跨域問題

做前後端分離的專案用到UEditor,把上傳圖片程式拿出來放到了介面程式中,上傳圖片介面已經做了跨域處理,按理說編輯器中上傳圖片應該不會有問題。可是配置好圖片上傳路徑後,執行,開啟除錯,測試一下,報錯了:  找到上傳圖片的程式碼,發現引用的是webuploader.js,先修改下,直接引用web

ssh框架+sitemesh編輯器圖片載入裝飾器問題導致圖片失敗

最近被kindeditor上傳圖片的問題困擾了一星期,在看了許多解決方法後經過無數次:( 真的是無數次 終於成功了。。。記性不好就寫下來好了 因為用的是jsp,所以kindeditor的部分檔案要修改,我把我的修改部分寫下面 首先要修改kindeditor/plugins

hbuilder圖片(帶旋轉)

IOS彈出選擇框:程式碼放在onclick中(mui)環境 function change() { if (mui.os.plus) { var a = [{ title: "拍照" }, { title: "相簿選取" }]; plus.n