亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Android?Camera實現(xiàn)旋轉(zhuǎn)角度

 更新時間:2022年07月20日 10:31:24   作者:Arvin?Hu  
這篇文章主要為大家詳細介紹了Android?Camera實現(xiàn)旋轉(zhuǎn)角度,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了Android Camera實現(xiàn)旋轉(zhuǎn)角度的具體代碼,供大家參考,具體內(nèi)容如下

概述

相機圖像數(shù)據(jù)都是來自于圖像傳感器(Image Sensor),相機模組出廠的時候有一個默認的取景方向,一般為以下兩種,請留意相機模組中小人的方向

  • Sensor 安裝默認都是 Sensor 的長邊與手機的長邊平行
  • 將上述圖1的模組裝入手機,結(jié)果為下圖

  • 兩顆模組不一定如圖左右擺放,也可以上下擺放,只要遵循長邊對長邊即可
  • 此時使用后攝預(yù)覽或拍照,取景方向是正常的,而手機目前相對自然方向(正常豎屏使用狀態(tài))順時針夾角為90度,這也就是常說的 Sensor orientation 是90度

將上述圖2的模組裝入手機,結(jié)果為下圖

  • 兩顆模組不一定如圖左右擺放,也可以上下擺放,只要遵循長邊對長邊即可
  • 此時使用后攝預(yù)覽或拍照,若要使取景方向正常,需將手機順時針旋轉(zhuǎn)180度,此時手機相對自然方向(正常豎屏使用狀態(tài))順時針夾角為270度,這也就是常說的 Sensor orientation 是270度

旋轉(zhuǎn)角度規(guī)律

  • 以下說明以 Sensor orientation 90度為例(大多數(shù)sensor都是該情況)
  • 屏幕顯示旋轉(zhuǎn)角度:Activity#getWindowManager().getDefaultDisplay().getRotation()的值,可以是 ROTATION_0(正常豎屏使用狀態(tài))、ROTATION_90(手機向右側(cè)放)、ROTATION_180(手機豎屏倒置)、ROTATION_270(手機向左側(cè)放)
  • 以屏幕角度 ROTATION_180且使用后攝為例,其他情況類比推理

當前情況下圖1模組中的小人頭部朝向左邊,有兩種方式判斷當前sensor取景后圖像方向

簡單方式:跟隨小人的視角去看實際被拍攝的物體(假設(shè)為正常站立的人),所看到的景象是頭部向右橫置的人,此時若要使看到的圖像恢復(fù)為正常情況,則需要將圖像順時針旋轉(zhuǎn)270度

復(fù)雜方式:sensor掃描方向遵從小人頭部左側(cè)頂點向右掃描,當前情況下也就是從左下向上逐行掃描,然后依次存儲到內(nèi)存中,存儲為圖片的時候是水平從左向右存儲,導(dǎo)致存儲后的圖像是頭部向右橫置的人,若要使圖像被拍攝后為正常情況,則需要將圖像順時針旋轉(zhuǎn)270度

代碼實現(xiàn)

Camera API1(官方實現(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)實畫面,因為當使用 TextureView 或者 SurfaceView 進行畫面預(yù)覽的時候,系統(tǒ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)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論