Camera2挖坑日記 如何解決預覽畫面變形

2021-09-24 06:27:16 字數 1662 閱讀 9233

一夢覺來三十載,休休。空為梅花白了頭

camera2是目前android相機開發最新的api,舊版本的camera已經被廢棄了。

一般情況下,camera2的使用是將影象傳送到su***ceview或者textureview【通過su***cetexture】來預覽。使用jpeg或者raw sensor格式的imagereader來捕獲jpeg影象或raw緩衝區。【注1】

今天主要是記錄一下, 在使用camera2api開發android相機過程中,解決預覽畫面變形的問題。

另,本文所記錄的情況,都是豎屏情況的裝置。

題主參考google方法給出的demo,自定義了textureview,可以自動適配寬高,支援全屏展示。**位址autofittextureview

以下的畫面基本上處於同一角度拍攝所得

如圖:

以題主手上的oppo r15為例,總共會返回13個可以用作輸出的size

需要注意的是,如果以豎屏為例,這裡的寬高是反過來的

在得到可用的size集合後,根據實際開發情況選擇合適的previewsize即可

正常小畫面展示

選定了乙個合適的previewsize之後,只需要適配textureview的寬高即可。小畫面以寬為基準,需要根據螢幕寬度來計算相應的高度即可。這一部分的**,在官方demo裡已經相當詳細。其實很簡單,就是自電影autofittextureview裡的onmeasure函式裡,重新設定寬高。

override fun onmeasure(....) else 

}複製**

其中ratiowidth、ratioheight即是previewsize

全屏展示

全屏展示預覽畫面,則需要使用textureview的另乙個函式——settransform。這個函式是給textureview設定乙個transform,用於改變textureview的畫面。by,雙指縮放時可以使用這個函式。

全屏展示時,textureview的寬高鋪滿整個螢幕,相應的我們只需要改變一下transform即可,此時高度不變,但是要將畫面的寬度放大。放大的倍數即為螢幕的高度除以小畫面時計算得來的高度比例即可。

還是在onmeasure函式內:

override fun onmeasure(...)

複製**

其中fullscreentransform即為textureview最初始的transform

題主將autofittextureview重新封裝了一下,對外提供了全屏展示的開關函式。位址在這裡autofittextureview,感興趣的童鞋可以去看一下。

以上

關於如何使用Unity的Camera(2)

今天開始使用2個不同的camera,最後乙個個屬性對照文件看了一下,發現渲染是有先後之分的,需要使ui最後渲染。這樣保證在最上層。而渲染的順序是由攝像機的深度來決定的,攝像機的深度越小,就越先渲染。關於tk2duicamera的一點小心得 tk2duicamera,老版本的tk2dcamera將會由...

如何解決Python2的記憶體洩漏問題

python程序記憶體撐大了下不去,只能手動重啟釋放記憶體,這麼坑爹的事情你遇到過嗎?哪家記憶體分配器強?結果一目了然。線上程序目前都是使用原生的python記憶體分配器 pymalloc 在正常的情況下表現還算穩定,但如果來了一波類似於武神壇或者天下第一的比武大會,為手機瞬間帶來了10倍於平時的流...

如何解決DB2資料遷移中的外來鍵約束問題

遷移資料的時候一定遇到過匯入匯出的外來鍵約束報錯問題,外來鍵約束是為了保證資料庫的完整性,完整性的英語單詞是integrity,所以這個臨時關閉外來鍵約束讓你暢快匯入的命令是 set integrity for table name off set integrity for table name ...