相機顯示知識:
- Camera
- SurfaceView (SurfaceView 也是TextureView,最常用的當然是SurfaceView 是以主講SurfaceView)
倆者關系腦圖
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHL00keNJTUE1UeRpHW4Z0MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL2UTO0MTN1cTMxATOwAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
一、SurfaceView 、Surface 、 SurfaceHolder
關系圖
Surface
Surface用來處理螢幕内容合成器所管理的原始緩存區的工具,由圖像緩沖區的消費者(如:Surfacetexture)建立然後移交給生産者(如MeddiaPlayer) 或者是顯示到(如:CameraDevice)
SurfaceHoler
抽象接口,給持有surface的對象使用,可以控制surface的大小和格式,編輯Surface種的像素,以及監聽surface的變化,這個接口通過SurfaceView獲得
SurfaceHoler中有一個Callback的接口通過腦圖大家可以看到,它的回調方法有3個
- surfaceCreated(SurfaceHolder holder) suface第一次調用的時候回調
- surfaceChanged(SurfaceHolder holder,int format ,int width ,int height) surface變化的時候回調 變化為大小和格式
- surfaceDestroyed(SurfaceHolder holder) suface銷毀的時候回調
SurfaceView
SurfaceView提供了嵌入視圖層級種的專用Surface,我們可以控制Surface的格式和大小。
SurfaceView則負責把Surface現實在螢幕的正确位置
SurfaceView 其實也是繼承自View,其中倆個成員變量,一個是Surface對象一個是SurfaceHolder對象。
- SurfaceView把Surface現實在螢幕
- SurfaceView通過SurfaceHoder告訴我們Surface的3個狀态 (建立 變化 銷毀)
- SurfaceView可以通過getHolder()方法獲得目前SurfaceView的SurfaceHolder對象讓就可以對SurfaceHolder對象添加回調的Surface進行監聽狀态
- SurfaceView是View的對象
- SurfaceView中有倆個對象,Surface和SurfaceHolder
- 通過getHolder()方法獲得目前SurfaceView的SurfaceHolder對象
二 、 Camera
Camera類中的内部類
CameraInfo 用來描述相機資訊,通過Camera中getCameInfo(int camerald,CameraInfo cameraInfo)方法獲得,主要包括一下成員變量。
- facing facing代表相機的方向,它的值隻能是CAMERA_FACING_BACK(後置攝像頭)和CAMERA_FACING_FRONT(前置攝像頭)。
CAMERA_FACING_BACK(後置攝像頭)和CAMERA_FACING_FRONT(前置攝像頭)Camera中的靜态變量
- orientation orientaion是相機采集的角度,他的值是采集到的圖檔順時針旋轉自然的角度值,它必須的0,90,180,270中的一個。 是以可以就可以知道在拿到相機拍照的時候角度為60的話那麼它在怎麼旋轉也不是可以為正的原因。
- setDisplayOrientation 設定預覽圖檔的順時針角度。注:這個方法會影響預覽圖像個拍照後現實的圖檔,這個方法對豎屏應用和圖檔非常有效。然後是前攝像頭在進行角度旋轉之前,圖像會進行一個水準的鏡像反轉,是以你打開相機預覽圖像的時候如同照鏡子,但是拍下照來才發現是水準方向的鏡像。 注:setDisplayOrientation(int degrees)是Camea類中的一個方法,之是以穿插在這裡來講,是為了和上面提到的orientation做一個統一講解,因為這兩個都涉及到了方向問題
- 螢幕坐标 在Android系統中,螢幕的左上角是坐标系統的圓點(0,0)坐标。原點向右是X軸的正方向,原點向下是Y軸的正方向。
- 自然方向 每個裝置都有一個自然方向,手機和平闆的自然方向不同。手機的自然方向是 portait(豎屏),平闆的就是(landscape) 橫屏
- 圖像傳感器 (imager Sensor) 方向 手機相冊的圖像資料都是來自攝像頭硬體的圖像傳感器,這個傳感器被固定到手機後的一個預設的取景方向
- 相機的預覽方向 将圖像傳感器捕獲的圖像,現實在螢幕上的方向。在預設 情況下,與預想傳感器方向一緻。在相機API中通過setDisplayOrientation()設定相機預覽方向在預設情況下,這個值為0與圖像傳感器方向一緻。
- 絕大部分安卓手機中圖像傳感器方向是橫向的,且不能改變,是以orientation是90或是270,也就是說,當點選拍照後儲存圖檔的時候,需要對圖檔做旋轉處理,使其為"自然方向"。 (可能存在一些特殊的定制或是能外接攝像頭的安卓機,他們的orientation會是0或者180)
- 通過setDisplayOrientation方法設定預覽方向,使預覽畫面為"自然方向"。前置攝像頭在進行角度旋轉之前,圖像會進行一個水準的鏡像翻轉,是以使用者在看預覽圖像的時候就像照鏡子一樣。
Camera内部類
SiZi 圖檔大小包含倆個變量:width和height (圖檔的寬和高)
Parameters
Parameters是相機服務設定,不同的相機可能是不相同的。比如相機所支援的圖檔大小,對焦模式等等。下面介紹一下這個類中常用的方法
- getSupportedPreviewSizes() 獲得相機支援的預覽圖檔大小,傳回值是 List(Sizi)
- setPreviewSize(int width, int height) 設定相機預覽的圖檔大小
- getSupportedPreviewFormats() 擷取相機支援的圖檔格式
- setPreviewFormat(int pixel_format) 設定圖檔的預覽格式
- getSupportedPictureSizes() 擷取相機支援的采集圖檔大小(就是拍照後儲存的圖檔大小)
- setPictureSize(int width, int height) 設定儲存的圖檔的大小
- getSupportedPictureFormats() 擷取相機支援的圖檔格式
- setPictureFormat() 設定相機儲存的圖檔格式
- getSupportedFocusModes() 擷取相機支援的對焦模式
- setFocusMode(String value) 設定相機的對焦模式
- getMaxNumDetectedFaces() 傳回相機最大的人臉檢測數量
PreviewCallback
PreviewCallback 是一個抽象接口
-
void onPreviewFrame(byte[] data, Camera camera)
通過onPreviewFrame方法來擷取到相機預覽的資料,第一個參數data,就是相機預覽到的原始資料。data可以轉換圖檔做人臉檢測
Face
Face類用來描述通過Camera的人臉檢測功能檢測到的人臉資訊
- rect rect 是一個Rect對象,它所表示的就是檢測到的人臉的區域
- score 人臉的可信度(0-100)
- leftEye 左眼位置坐标系
- rightEye 右眼位置坐标系
- mouth 眼睛位置坐标系
- leftEye rightEye mouth 都是 Point 對象 部分手機可能傳回來為 null
FaceDetectionListener
抽象接口開始人臉檢測的時候回調
-
onFaceDetection(Face[] faces, Camera camera)
第一參數代表檢測到的人臉,是一個Face數組(畫面内可能存在多張人臉)
Camera類中的方法
-
getNumberOfCameras()
傳回目前裝置上可用的攝像頭個數
-
open()
使用目前裝置上第一個後置攝像頭建立一個Camera對象。如果目前裝置沒有後置攝像頭,則傳回值為null
-
open(int cameraId)
使用傳入id所表示的攝像頭建立一個Camera對象,如果id所表示的攝像頭已經被打開,則會抛出異常
裝置上每一個實體攝像都是有一個id的,id從0開始,到getNumberOfCameras() - 1 結束
-
getCameraInfo(int cameraId, CameraInfo cameraInfo)
傳回指定id所表示的攝像頭的資訊
-
setDisplayOrientation(int degrees)
設定相機預覽畫面旋轉的角度
-
setPreviewDisplay(SurfaceHolder holder)
設定一個Surface對象用來實時預覽
-
setPreviewCallback(PreviewCallback cb)
設定相機預覽資料的回調,參數是一個PreviewCallback對象
-
getParameters()
傳回目前相機的參數資訊,傳回值是一個Parameters對象
-
setParameters(Parameters params)
設定目前相機的參數資訊
-
startPreview()
開始預覽
調用此方法之前,如果沒有setPreviewDisplay(SurfaceHolder) 或 setPreviewTexture(SurfaceTexture)的話,是沒有效果
-
stopPreview()
停止預覽
-
startFaceDetection()
開始人臉檢測
這個方法必須在開始預覽之後調用
-
stopFaceDetection()
停止人臉檢測
-
setFaceDetectionListener(FaceDetectionListener listener)
設定人臉檢測監聽回調
-
release()
釋放相機
第一章末尾