Android?Camera實(shí)現(xiàn)旋轉(zhuǎn)角度
本文實(shí)例為大家分享了Android Camera實(shí)現(xiàn)旋轉(zhuǎn)角度的具體代碼,供大家參考,具體內(nèi)容如下
概述
相機(jī)圖像數(shù)據(jù)都是來自于圖像傳感器(Image Sensor
),相機(jī)模組出廠的時(shí)候有一個(gè)默認(rèn)的取景方向,一般為以下兩種,請(qǐng)留意相機(jī)模組中小人的方向
Sensor
安裝默認(rèn)都是Sensor
的長邊與手機(jī)的長邊平行- 將上述圖1的模組裝入手機(jī),結(jié)果為下圖
- 兩顆模組不一定如圖左右擺放,也可以上下擺放,只要遵循長邊對(duì)長邊即可
- 此時(shí)使用后攝預(yù)覽或拍照,取景方向是正常的,而手機(jī)目前相對(duì)自然方向(正常豎屏使用狀態(tài))順時(shí)針夾角為90度,這也就是常說的 Sensor orientation 是90度
將上述圖2的模組裝入手機(jī),結(jié)果為下圖
- 兩顆模組不一定如圖左右擺放,也可以上下擺放,只要遵循長邊對(duì)長邊即可
- 此時(shí)使用后攝預(yù)覽或拍照,若要使取景方向正常,需將手機(jī)順時(shí)針旋轉(zhuǎn)180度,此時(shí)手機(jī)相對(duì)自然方向(正常豎屏使用狀態(tài))順時(shí)針夾角為270度,這也就是常說的
Sensor orientation
是270度
旋轉(zhuǎn)角度規(guī)律
- 以下說明以
Sensor orientation
90度為例(大多數(shù)sensor都是該情況) - 屏幕顯示旋轉(zhuǎn)角度:Activity#getWindowManager().getDefaultDisplay().getRotation()的值,可以是
ROTATION_0
(正常豎屏使用狀態(tài))、ROTATION_90
(手機(jī)向右側(cè)放)、ROTATION_180
(手機(jī)豎屏倒置)、ROTATION_270
(手機(jī)向左側(cè)放) - 以屏幕角度
ROTATION_180
且使用后攝為例,其他情況類比推理
當(dāng)前情況下圖1模組中的小人頭部朝向左邊,有兩種方式判斷當(dāng)前sensor取景后圖像方向
簡單方式:跟隨小人的視角去看實(shí)際被拍攝的物體(假設(shè)為正常站立的人),所看到的景象是頭部向右橫置的人,此時(shí)若要使看到的圖像恢復(fù)為正常情況,則需要將圖像順時(shí)針旋轉(zhuǎn)270度
復(fù)雜方式:sensor掃描方向遵從小人頭部左側(cè)頂點(diǎn)向右掃描,當(dāng)前情況下也就是從左下向上逐行掃描,然后依次存儲(chǔ)到內(nèi)存中,存儲(chǔ)為圖片的時(shí)候是水平從左向右存儲(chǔ),導(dǎo)致存儲(chǔ)后的圖像是頭部向右橫置的人,若要使圖像被拍攝后為正常情況,則需要將圖像順時(shí)針旋轉(zhuǎn)270度
代碼實(shí)現(xiàn)
Camera API1(官方實(shí)現(xiàn))
public static void setCameraDisplayOrientation(Activity activity, int cameraId, android.hardware.Camera camera) { ?? ?android.hardware.Camera.CameraInfo info = new android.hardware.Camera.CameraInfo(); ? ? android.hardware.Camera.getCameraInfo(cameraId, info); ? ? int rotation = activity.getWindowManager().getDefaultDisplay().getRotation(); ? ? int degrees = 0; ? ? switch (rotation) { ? ? ? ? case Surface.ROTATION_0: degrees = 0; break; ? ? ? ? case Surface.ROTATION_90: degrees = 90; break; ? ? ? ? case Surface.ROTATION_180: degrees = 180; break; ? ? ? ? case Surface.ROTATION_270: degrees = 270; break; ? ? } ? ? int result; ? ? if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { ? ? ? ? result = (info.orientation + degrees) % 360; ? ? ? ? result = (360 - result) % 360; ?// compensate the mirror ? ? } else { ?// back-facing ? ? ? ? result = (info.orientation - degrees + 360) % 360; ? ? } ? ? camera.setDisplayOrientation(result); }
Camera API2
Camera API2
不需要經(jīng)過任何預(yù)覽畫面方向的矯正,就可以正確現(xiàn)實(shí)畫面,因?yàn)楫?dāng)使用 TextureView
或者 SurfaceView
進(jìn)行畫面預(yù)覽的時(shí)候,系統(tǒng)會(huì)自動(dòng)矯正預(yù)覽畫面的方向
private static final SparseIntArray ORIENTATIONS = new SparseIntArray(); // Conversion from screen rotation to JPEG orientation. static { ? ? ORIENTATIONS.append(Surface.ROTATION_0, 90); ? ? ORIENTATIONS.append(Surface.ROTATION_90, 0); ? ? ORIENTATIONS.append(Surface.ROTATION_180, 270); ? ? ORIENTATIONS.append(Surface.ROTATION_270, 180); } /** ?* Retrieves the JPEG orientation from the specified screen rotation. ?* ?* @param rotation The screen rotation. ?* @return The JPEG orientation (one of 0, 90, 270, and 360) ?*/ private int getOrientation(int rotation) { ? ? // Sensor orientation is 90 for most devices, or 270 for some devices (eg. Nexus 5X) ? ? // We have to take that into account and rotate JPEG properly. ? ? // For devices with orientation of 90, we simply return our mapping from ORIENTATIONS. ? ? // For devices with orientation of 270, we need to rotate the JPEG 180 degrees. ? ? return (ORIENTATIONS.get(rotation) + mSensorOrientation + 270) % 360; } final CaptureRequest.Builder captureBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE); int rotation = activity.getWindowManager().getDefaultDisplay().getRotation(); captureBuilder.set(CaptureRequest.JPEG_ORIENTATION, getOrientation(rotation));
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android Intent 用法全面總結(jié)及實(shí)例代碼
這篇文章主要介紹了Android Intent 用法全面總結(jié)的相關(guān)資料,并附實(shí)例代碼,需要的朋友可以參考下2016-09-09利用libmp3lame實(shí)現(xiàn)在Android上錄音MP3文件示例
本篇文章主要介紹了利用Lame庫實(shí)現(xiàn)在Android上錄音MP3文件示例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-03-03Android利用GridView實(shí)現(xiàn)單選效果
本篇文章主要介紹了Android利用GridView實(shí)現(xiàn)單選效果的相關(guān)知識(shí),具有很好的參考價(jià)值。下面跟著小編一起來看下吧2017-05-05Android系統(tǒng)優(yōu)化Ninja加快編譯
這篇文章主要為大家介紹了Android系統(tǒng)優(yōu)化使用Ninja加快編譯示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08Android 中 Tweened animation的實(shí)例詳解
這篇文章主要介紹了Android 中 Tweened animation的實(shí)例詳解的相關(guān)資料,希望通過本文能幫助到大家,讓大家理解掌握這部分內(nèi)容,需要的朋友可以參考下2017-09-09Android CountDownTimer實(shí)現(xiàn)定時(shí)器和倒計(jì)時(shí)效果
這篇文章主要為大家詳細(xì)介紹了Android CountDownTimer實(shí)現(xiàn)定時(shí)器和倒計(jì)時(shí)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-02-02淺析Android手機(jī)衛(wèi)士接收短信指令執(zhí)行相應(yīng)操作
通過廣播接收者,接收到短信,對(duì)短信內(nèi)容進(jìn)行判斷,如果為我們指定的值就執(zhí)行相應(yīng)的操作。本文給大家介紹Android手機(jī)衛(wèi)士接收短信指令執(zhí)行相應(yīng)操作,感興趣的朋友參考下吧2016-04-04Android中imageView圖片放大縮小及旋轉(zhuǎn)功能示例代碼
這篇文章主要介紹了Android中imageView圖片放大縮小及旋轉(zhuǎn)功能示例代碼,需要的朋友可以參考下2017-08-08Android Material加載進(jìn)度條制作代碼
這篇文章主要為大家詳細(xì)介紹了AndroidMaterial加載進(jìn)度條的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01