中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android開發實踐:掌握Camera的預覽方向和拍照方向

發布時間:2020-07-09 21:40:30 來源:網絡 閱讀:25642 作者:Jhuster 欄目:移動開發

Android的Camera相關應用開發中,有一個必須搞清楚的知識點,就是Camera的預覽方向和拍照方向,本文就重點討論一下這個問題。


圖像的Sensor方向:手機Camera的圖像數據都是來自于攝像頭硬件的圖像傳感器(Image Sensor),這個Sensor被固定到手機之后是有一個默認的取景方向的,這個方向如下圖所示,坐標原點位于手機橫放時的左上角:

Android開發實踐:掌握Camera的預覽方向和拍照方向


Camera的預覽方向:由于手機屏幕可以360度旋轉,為了保證用戶無論怎么旋轉手機都能看到“正確”的預覽畫面(這個“正確”是指顯示在UI預覽界面的畫面與你人眼看到的眼前的畫面是一致的),Android系統底層根據當前手機屏幕的方向對圖像Sensor采集到的數據進行了旋轉處理,然后后才送給顯示系統,因此,打開Camera應用后,無論怎么旋轉手機,你都能看到“正確”的畫面,Android系統提供一個API來手動設置Camera的預覽方向,叫做setDisplayOrientation,默認情況下,這個值是0,與圖像Sensor方向一致,所以對于橫屏應用來說,就不需要更改這個Camera預覽方向。但是,如果你的應用是豎屏應用,就必須通過這個API將Camera的預覽方向旋轉90,與手機屏幕方向一致,這樣才會得到正確的預覽畫面。


Camera的拍照方向:當你點擊拍照按鈕,得到的圖片方向不一定與畫面中預覽的方向一致,這是因為拍攝的照片是將圖像Sensor采集到的數據直接存儲到SDCard上的,因此,Camera的拍照方向與上述的Camera的圖像Sensor方向一致。


為了演示這個問題,我用手機的Camera對同一個場景拍了兩張照片,第一張是橫著拿手機拍的,第二張是豎著拿手機拍的。然后用在電腦上打開得到的圖片(實際場景中的杯子是豎著的),效果如下所示:


Android開發實踐:掌握Camera的預覽方向和拍照方向


由此可見,如果橫向拿手機拍照,由于正好與Camera的拍照方向一致,因此得到的照片是“正確”的;而豎著拿手機拍照的話,Camera的圖像Sensor依然以上面描述的角度在采集圖像并存儲到SDCard上,所以得到的圖片就是右圖這樣的,因為豎著拿手機正好與圖像Sensor的方向相差了90度。由此,大家應該明白了為什么我們用手機拍出的照片經常需要旋轉90度才能看到“正確”的畫面了吧?


我想上面的介紹應該已經把這個問題講清楚了,下面我還想再深入一下,介紹一下設置Camera預覽方向的那個API(setDisplayOrientation)。


上面說了,對于橫屏應用,不需要額外設置這個方向,但是對于豎屏應用,則需要調用setDisplayOrientation(90),來保證Camera的預覽方向與Activity的方向一致,那么設置了這個函數究竟會不會影響到Camera拍照的結果呢?根據上面的分析,理論上應該是不影響的,因為拍照得到的圖片方向是與圖像Sensor的方向一致的,當然,我們可以通過Android官方API的注釋文檔驗證一下這個猜想,下面是Camera.setDisplayOrientation的注釋文檔:


/**
 * Set the clockwise rotation of preview display in degrees. This affects
 * the preview frames and the picture displayed after snapshot. This method
 * is useful for portrait mode applications. Note that preview display of
 * front-facing cameras is flipped horizontally before the rotation, that
 * is, the p_w_picpath is reflected along the central vertical axis of the camera
 * sensor. So the users can see themselves as looking into a mirror.
 *
 * <p>This does not affect the order of byte array passed in {@link
 * PreviewCallback#onPreviewFrame}, JPEG pictures, or recorded videos. This
 * method is not allowed to be called during preview.     
 */
 
public native final void setDisplayOrientation(int degrees);


重點看這兩句話:


This affects the preview frames and the picture displayed after snapshot.

This does not affect the order of byte array passed in {@link
 * PreviewCallback#onPreviewFrame}, JPEG pictures, or recorded videos.


由此我們得到驗證了,這個API修改的僅僅是Camera的預覽方向而已,并不會影響到PreviewCallback回調、生成的JPEG圖片和錄像文件的方向,這些數據的方向依然會跟圖像Sensor的方向一致。


關于Android Camera的預覽和拍照方向的介紹就到這里了,希望對Camera應用開發的新手們能有所幫助,有任何疑問歡迎留言或者來信lujun.hust@gmail.com交流,或者關注我的新浪微博 @盧_俊 獲取最新的文章和資訊。


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

西华县| 双牌县| 安图县| 海原县| 兴化市| 施甸县| 岳西县| 宿松县| 曲水县| 景宁| 景泰县| 洮南市| 栖霞市| 汤阴县| 密云县| 江口县| 昆山市| 武胜县| 海阳市| 平凉市| 沁源县| 沾益县| 庄河市| 禄丰县| 鲜城| 田阳县| 陇西县| 延庆县| 平潭县| 平南县| 白水县| 黄山市| 鹿邑县| 郁南县| 石台县| 安达市| 都昌县| 霍林郭勒市| 长葛市| 西乌珠穆沁旗| 龙游县|