一、部分android手機拍照後**被旋轉的解決方案
在部分android手機(如mt788、note2)上,使用camera拍照以後,得到的**會被自動旋轉(90°、180°、270°),這個情況很不符合預期。仔細分析了一下,因為**屬性中是儲存了旋轉資訊的,所以要解決這個問題,可以在onactivityresult方法中,獲取到**資料後,讀取它的旋轉資訊,如果不是0,說明這個**已經被旋轉過了,那麼再使用android.graphics.matrix將**旋轉回去即可。
1、讀取的旋轉屬性
/***
讀取的旋轉的角度**
@param path
*
絕對路徑
*@return 的旋轉角度
*/private int getbitmapdegree(string path)
} catch (ioexception e)
return degree;
}2、將按照某個角度進行旋轉
/***
將按照某個角度進行旋轉**
@param bm
*
需要旋轉的
*@param degree
*
旋轉角度
*@return 旋轉後的
*/public static bitmap rotatebitmapbydegree(bitmap bm, int degree) catch (outofmemoryerror e)
if (returnbm == null)
if (bm != returnbm)
return returnbm;
}二、預覽影象
camera拍照:
camera.parameters params = camera.getparameters();
params.setpreviewsize(width, height);
params.setpreviewframerate(4);
params.setpictureformat(pixelformat.jpeg);
params.set("jpeg-quality", 85);
params.setpicturesize(width, height);
camera.setparameters(params);
camera.setpreviewdisplay(sholder);
camera.startpreview();
camera.autofocus(null);
於是在網上搜尋,發現確實存在這樣乙個問題,網上的解決方法也各不一致。最後用setdisplayorientation()方法解決了,修改後的**如下:
camera.parameters params = camera.getparameters();
params.setpreviewsize(height, width); 1
params.setpreviewframerate(4);
params.setpictureformat(pixelformat.jpeg);
params.set("jpeg-quality", 85);
params.setpicturesize(height, width); 2
camera.setparameters(params);
camera.setdisplayorientation(90); 3
camera.setpreviewdisplay(sholder);
camera.startpreview();
camera.autofocus(null);
首先新增了**3,讓camera旋轉90度。測試時發現雖然影象轉回正常,但是上下卻拉長了。進過研究修改**1,把長寬顛倒。再測試預覽正常了,但是拍照的時候獲取的卻依然是拉長的,於是修改**2。這回拍照正常,但是仍然存在乙個問題,儲存的是橫著的。
看網上很多人都遇到了這個問題,好像與系統有關,既然沒法在camera這裡搞定,那麼就將獲取的bitmap進行旋轉。程式裡通過重寫picturecallback的onpicturetaken來獲取,**是
bitmap bm = bitmapfactory.decodebytearray(data, 0, data.length);
在這裡可以對bm進行旋轉,**如下:
bitmap bm0 = bitmapfactory.decodebytearray(data, 0, data.length);
matrix m = new matrix();
m.setrotate(90,(float) bm0.getwidth() / 2, (float) bm0.getheight() / 2);
final bitmap bm = bitmap.createbitmap(bm0, 0, 0, bm0.getwidth(), bm0.getheight(), m, true);
這樣儲存的就正常了!
mediarecorder錄影:
同樣的預覽問題在錄影中也出現了,但是由於是用mediarecorder進行錄影,沒有camera物件,一時比較無措。後來經過網友的提醒,想到了mediarecorder有setcamera()的方法,於是新增如下**:
camera c = camera.open();
c.setdisplayorientation(90);
c.unlock();
mrecorder.setcamera(c);
三、另外相關參考
1、預覽時正確顯示
主要參考系統相機**實現getdisplayoritation就可以了
//在preview之前呼叫setdisplayorientation
int degrees = getdisplayoritation(getdispalyrotation(), cameraid);
mcamera.setdisplayorientation(degrees);
mcamera.startpreview();
getdisplayoritation函式如下:
private int getdisplayoritation(int degrees, int cameraid) else
return result;
}private int getdispalyrotation()
return 0;
}2、顯示時正確顯示
豎屏拍照的**,直接使用的話,會旋轉90度
參考系統相簿的**,需要先查詢mediascanner的orientation欄位,然後應用再把角度旋轉過來,這樣顯示就ok了
假設c為查詢mediaprovider資料庫返回的cursor
int rotation = c.getint(c.getcolumnindex(mediastore.images.imagecolumns.orientation));
if (rotation != 0)
android 拍照注意問題
intent intent new intent mediastore.action image capture startactivityforresult intent,reqcode reqcode是返回的code。但是在有些手機會在protected void onactivityresul...
android相機拍照
拍照有兩種方式,一是使用android.hardware.camera,二是使用intent android.media.action.image capture 當然還是第一種好,不過 太複雜,以後有時間再說,這裡就說一下第二種方式吧。try catch exception e 這樣就可以呼叫系統...
Android手機拍照(Android學習隨筆九)
使用android.hardware.camera類來拍 具體步驟如下 a 獲取camera例項物件,cameracamera camera.open 或者,cameracamera camera.open intcameraid cameraid表示camera裝置號,即與指定的camera進行連...