導航:首頁 > 操作系統 > android相機方向

android相機方向

發布時間:2023-03-18 03:27:12

android Camera開發系列:調整Camera預覽方向

有時候我們想根據自己的需要調整下Camera的預覽方向,那麼是調用哪個API可以達到我們的目的呢?

我們看下下圖拍的幾張小可愛的照片,分別是正常方向、旋轉180度、90度拍的照片。

Camera1上,我們可以通過 setDisplayOrientation(int degress); 來設置camera預覽的方向。

這里也貼下源碼裡面關於setDisplayOrientaion介面的詳細說明。

Camera2的API上,找了一通,發現並沒有像Camera1上,可以通過類似的介面來設置預覽方向,不過可以通過TextureView.setTransform(matrix);來通過調整textureView的顯示來達到目的。

Ⅱ android 相機開發取景方向不對怎麼辦

/虧啟凳/設置拍攝方旁春向
this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
setContentView(R.layout.activity_main);
注意位置銷旅

Ⅲ android Camera如何判斷當前使用的攝像頭是前置還是後置

現在 android 平台的智能手機一般都標配有兩顆攝像頭。在 Camera 中都存在攝像頭切換的功能。
並且有一些功能前後置改盯歲攝像頭上會有所不同。譬如人臉檢測,人臉識別,自動對焦,閃光燈等功能,
如果前置攝像頭的像素太低,不支持該功能的話,就需要在前置攝像頭上關掉該 feature.

那麼是如何判斷並切換前後置攝像頭的呢?
我們先來看下核睜 CameraInfo 這則兄個類,

[java] view plain
/**
* Information about a camera
*/
public static class CameraInfo {
/**
* The facing of the camera is opposite to that of the screen.
*/
public static final int CAMERA_FACING_BACK = 0;

/**
* The facing of the camera is the same as that of the screen.
*/
public static final int CAMERA_FACING_FRONT = 1;

/**
* The direction that the camera faces. It should be
* CAMERA_FACING_BACK or CAMERA_FACING_FRONT.
*/
public int facing;

/**
* The orientation of the camera image. The value is the angle that the
* camera image needs to be rotated clockwise so it shows correctly on
* the display in its natural orientation. It should be 0, 90, 180, or 270.

*
*
For example, suppose a device has a naturally tall screen. The
* back-facing camera sensor is mounted in landscape. You are looking at
* the screen. If the top side of the camera sensor is aligned with the
* right edge of the screen in natural orientation, the value should be
* 90. If the top side of a front-facing camera sensor is aligned with
* the right of the screen, the value should be 270.
*
* @see #setDisplayOrientation(int)
* @see Parameters#setRotation(int)
* @see Parameters#setPreviewSize(int, int)
* @see Parameters#setPictureSize(int, int)
* @see Parameters#setJpegThumbnailSize(int, int)
*/
public int orientation;
};

見名知義,它就是一個 Camera 信息類。它是通過與屏幕的方向是否一致來定義前後置攝像頭的。

與屏幕方向相反即為 BACK_FACING_CAMERA
與屏幕方向一致即為 FRONT_FACING_CAMERA
那麼在代碼中我們是如何獲取當前使用的 CamerInfo 呢

[java] view plain
Camera.CameraInfo info = new Camera.CameraInfo();
Camera.getCameraInfo(cameraId, info);
當然,使用該代碼的前提是要 import android.hardware.Camera.CameraInfo;

判斷使用是前置還是後置攝像頭,可以通過if (info.facing == CameraInfo.CAMERA_FACING_FRONT) 來判斷。
當Camera 的實例已經創建了的情況下,則需要通過如下方式來判斷。

[java] view plain
CameraInfo info = CameraHolder.instance().getCameraInfo()[mCameraId];
if (info.facing == CameraInfo.CAMERA_FACING_FRONT) {
//stopFaceDetection();
}

也可以通過 if(mCameraId == CameraInfo.CAMERA_FACING_FRONT) 來判斷。
其中 mCameraId 是當前使用的 CameraId, 一般前置為1, 後置為 0。

Ⅳ Android 系統原生相機API角度原理與適配

雖然Camera作為第一代原生android所提供的相機類一直被開發者甚至Google官方開發人員所詬病,但為了兼容和適配Android版本5.0以下的App應用,我們別無選擇。因此,有了本篇文檔詳細闡述1.0版的Camera 是如何使用的。本篇使用的是SurfaceView與Camera類。

文檔下文會在拍照流程中的不同的階段應用到上述四個角度,而「終端自然方向」貫穿整個流程當中。這一個方向、四個角度非常重要,缺一不可,是支撐相機Camera 系列API的關鍵。在設計NXDesign的相機項目中,經過對官方文檔的研讀和各路資料的調研之後發現,我們在網路上查到的博客類相關資料有80%的實現方式是存在問題的,當然,這也可以歸咎於該API其本身確實不好用,如果不對源碼注釋進行仔細研究,很容易對開發者產生誤導。

更加准確的說,相機的生命周期是依託於SurfaceView的創建和銷毀來完成的。SurfaceView的作用是提供相機內容的實時預覽。我們需要在surfaceview創建好之後打開相機使用相機資源,在surfaceview被銷毀後釋放相機資源。

surfaceview 提供了holder機制向調用方通知surfaceview的變化時機,為了在不同的時機對相機資源做不同的事情,需要調用SurfaceHolder.addCallback()方法。

現在的Android手機一般會有多個攝像頭,但根據其方向可以歸為兩類: CAMERA_FACING_BACK 和 CAMERA_FACING_FRONT 。在打開攝像頭之前,首先需要獲取相機資源,判斷相機個數 Camera.getNumberOfCameras() 。每個相機對應一個CameraInfo,它的定義如下:

這里涉及到一個重要概念:相機圖像感測器(camera sensor),想要理解上述注釋的含義,就需要先理解下圖內容。

左圖是通常情況下,我們對view的x y方向的認知,以屏幕的左上角為原點向右為x正方向,向下為y正方向;但是,右圖描述的是絕大多數情況下, 相機圖像感測器 的起始位置和方向判定。與view不同的是,感測器以手機屏幕在自然方向上的右上角為原點,向下為x正方向,向左為y正方向。因此,我們理解上述注釋就不難了。如果相機自帶的感測器頂部與終端自然方向(手機屏幕的硬體方向,一般手機都是豎直方向,也就是文檔中說的naturally tall screen)的右邊緣一致,則這個值就是90度。如果前置攝像頭感測器的頂部與手機自然方向一致,則這個值就是270度。

當我們定義startCamera()方法時,要做5件事情,1.遍歷攝像頭cameraId,找到想要打開的攝像頭(前置還是後置);2.獲取攝像頭信息,主要獲取orientation;3. 設置相機DisplayOrientation 4.設置相機參數,主要是寬高比、對焦模式、圖片格式、setRotation等。5. 向camera設置surfaceview.viewholder,並且startPreview。主要邏輯如下:

拿到cameraInfo.orientation之後,要調用camera.setDisplayOrientation設置進去,保證通過surfaceview預覽到的取景跟當前的手機方向保持一致,但是,setDisplayOrientation設置的其實是經過兩個角度計算之後的復合角度,而並不單純是cameraInfo.orientation。正確的做法是這樣的:先獲取手機屏幕的旋轉方向,然後與cameraInfo.orientation加和得到最終角度。通常情況下,如果我們設置相機為portrait,則不用考慮rotation。這也是為什麼絕大部分網路資料中都會粗暴的寫入一個90度完事兒而並沒有解釋這么做的道理。

調用camera.takePicture(null, null, pictureCallback)

這里需要做的僅僅是將callback中返回的data存儲為File。需要注意的是,data中會包含setRotation()方法中的角度信息,因此如果直接使用Bitmap工具類生成bitmap,再進行存儲或者展示,生成出來的圖像其實是缺失了旋轉角度的原始方向,這十有八九會發生圖像展示角度錯誤的情況。因此,需要直接保存,再通過Exif工具類讀取File中的角度信息(當然Exif工具類就是為了讀取File中的各種信息而生的,比如拍照時間、經緯度等等)。

基於Camera API,
surfaceview的預覽需要setDisplayOrientation(),入參角度與CameraInfo.orientation(感測器偏角)和WindowManager.default.displayOrientation(屏幕旋轉角度)兩個角度有關。
相機拍照前需要setRotation(),入參角度與CameraInfo.orientation(感測器偏角)和OrientationEventListener返回的orientation(終端自然角度偏角)有關,二者的換算結果就是圖像寫入偏角,該偏角意味著圖像被順時針旋轉該角度就能夠回正展示。

Ⅳ Android中Camera方向問題總結

          如今生活當中每一個人都離不開手機,拍攝照片更加常見,剛好最近在研究Android中的Camera的「方向」問題,總結一下。好了,進入正題,通過手機的Camera拍攝出來的照片來自於相機的圖像感測器,相機被固定到手機後,相機的圖像感測器的圖像採集方向就固定住了,因此相機感測器的採集圖像的方向我們是改變不了,只能對採集後獲得的圖片數據進行旋轉,以便得到正確的預覽。我們可以通過CameraInfo對象的orientation屬性來獲取圖像感測器的圖像採集方向,orientation屬性就描述著相機的圖像感測器採集圖像的方向,orientation是一個角度值,只能是0,90,180,270四個中的一個,表示的含義就是圖像感測器採集圖像的角度,忘記說了,這里的角度是相對於手機的「自然方向」來說的,何為「自然方向」?是指當寬比高短時,我們看到的手機的方向(豎屏),可以這樣理解,這個值是相機所採集的圖片需要順時針旋轉至自然方向的角度值,因為如果我們要想在手機的自然方向上正確預覽相機拍照的圖片數據,我們必須對相機感測器採集的圖像進行順時針旋轉,這個旋轉的角度就是orientation,注意只能對拍沖培照後獲得的圖片鬧判或數據進行旋轉,我們是無法改變相機感測器採集圖像的方向的,因為它在相機被固定到手機上後,就被固定死了。 

             圖像感測器的預覽方向默認情況下是和圖像感測器的圖像採集方向是一致,也就是前面提到的orientation值,那這里為什麼說默認呢?是因為相機感測器的預覽方向是可以改變的,不像圖像感測器的圖像採集方向無法改變,通過Camera對象的setDisplayOrientation方法改變預覽方向(順時針旋轉)。對大部分手機來說,後置攝像頭的orientation為90,也就是說我們需要對拍照採集的圖片數據順時針旋轉90度,才能夠在自然方向正確預覽我們拍攝後的圖片,需要通過Camera對象的setDisplayOrientation順時針旋轉90度才能在自然方向正確預覽我們的攝像頭畫面。同樣對於大部分手機來說,前置攝像頭的orientation通常為270度,也就是說我們需要對拍照採集的圖片數據順時針旋轉270度,才能夠在自然方向正確預覽我們拍攝後的圖片,但是我們預覽方向我們卻不是順時針旋轉270度,而是90度,這是為什麼呢?因為前者攝像頭會在旋轉預覽方向之前,會對預覽方向來一個水平的鏡像翻轉,這就是為什麼我們通過前者攝像頭像是在照鏡子一液伍般,可能還不太理解,我們會通過圖片來對上面的分析進行演示。 

後置攝像頭orientation=90,此時圖像感測器採集圖像的方向90度,相對於自然方向,如下:

此時圖像採集的方向我們是無法改變的,但是能夠改變預覽的方向,通過setDisplayOrientation(90)順時針旋轉預覽方向,以便在自然方向進行正確預覽。

我們來看看前置攝像頭orientation=270的情況,銘記前置攝像頭預覽方向在旋轉之前會進行一個水平鏡像翻轉(可以理解為逆時針旋轉180),這就是為什麼我們通過手機前置攝像頭預覽時,看到的像是在照鏡子一般。

此時我們需要將獲取到的圖片數據進行順時針旋轉270度,才能夠在手機自然方向正確預覽。接下來看看前者攝像頭預覽方向,注意咯

好了,就到這,水平有限,有什麼錯誤的地方,希望各位大神留言,拜託了。

閱讀全文

與android相機方向相關的資料

熱點內容
一加7pro文件夾data 瀏覽:424
程序員淋雨 瀏覽:947
python輸出數字序列中的空格 瀏覽:78
怎麼將pdf文件大小 瀏覽:734
氧原子相對分子量演算法 瀏覽:988
加密機為什麼是安全的 瀏覽:451
單片機拼音輸入法 瀏覽:789
蘋果筆記本t2加密晶元怎麼打開 瀏覽:796
安卓如何把手機投屏至電視 瀏覽:739
方舟編譯器現在可提速哪些軟體 瀏覽:60
微信加密為什麼是黑屏 瀏覽:473
android去電狀態 瀏覽:604
蘋果13如何加密視頻 瀏覽:815
linuxweblogic緩存 瀏覽:69
雲伺服器不同地域 瀏覽:946
python鬧鍾怎麼打 瀏覽:686
虛擬主機伺服器有什麼區別 瀏覽:833
演算法與程序的奧秘章節檢測 瀏覽:378
找pdf 瀏覽:531
與伺服器連接斷開如何處理 瀏覽:834