android拍照角度轉換問題

2021-08-16 04:54:00 字數 3519 閱讀 1601

一、部分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進行連...