溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Android開(kāi)發(fā)實(shí)踐:掌握Camera的預(yù)覽方向和拍照方向

發(fā)布時(shí)間:2020-07-09 21:40:30 來(lái)源:網(wǎng)絡(luò) 閱讀:25637 作者:Jhuster 欄目:移動(dòng)開(kāi)發(fā)

Android的Camera相關(guān)應(yīng)用開(kāi)發(fā)中,有一個(gè)必須搞清楚的知識(shí)點(diǎn),就是Camera的預(yù)覽方向和拍照方向,本文就重點(diǎn)討論一下這個(gè)問(wèn)題。


圖像的Sensor方向:手機(jī)Camera的圖像數(shù)據(jù)都是來(lái)自于攝像頭硬件的圖像傳感器(Image Sensor),這個(gè)Sensor被固定到手機(jī)之后是有一個(gè)默認(rèn)的取景方向的,這個(gè)方向如下圖所示,坐標(biāo)原點(diǎn)位于手機(jī)橫放時(shí)的左上角:

Android開(kāi)發(fā)實(shí)踐:掌握Camera的預(yù)覽方向和拍照方向


Camera的預(yù)覽方向:由于手機(jī)屏幕可以360度旋轉(zhuǎn),為了保證用戶無(wú)論怎么旋轉(zhuǎn)手機(jī)都能看到“正確”的預(yù)覽畫(huà)面(這個(gè)“正確”是指顯示在UI預(yù)覽界面的畫(huà)面與你人眼看到的眼前的畫(huà)面是一致的),Android系統(tǒng)底層根據(jù)當(dāng)前手機(jī)屏幕的方向?qū)D像Sensor采集到的數(shù)據(jù)進(jìn)行了旋轉(zhuǎn)處理,然后后才送給顯示系統(tǒng),因此,打開(kāi)Camera應(yīng)用后,無(wú)論怎么旋轉(zhuǎn)手機(jī),你都能看到“正確”的畫(huà)面,Android系統(tǒng)提供一個(gè)API來(lái)手動(dòng)設(shè)置Camera的預(yù)覽方向,叫做setDisplayOrientation,默認(rèn)情況下,這個(gè)值是0,與圖像Sensor方向一致,所以對(duì)于橫屏應(yīng)用來(lái)說(shuō),就不需要更改這個(gè)Camera預(yù)覽方向。但是,如果你的應(yīng)用是豎屏應(yīng)用,就必須通過(guò)這個(gè)API將Camera的預(yù)覽方向旋轉(zhuǎn)90,與手機(jī)屏幕方向一致,這樣才會(huì)得到正確的預(yù)覽畫(huà)面。


Camera的拍照方向:當(dāng)你點(diǎn)擊拍照按鈕,得到的圖片方向不一定與畫(huà)面中預(yù)覽的方向一致,這是因?yàn)榕臄z的照片是將圖像Sensor采集到的數(shù)據(jù)直接存儲(chǔ)到SDCard上的,因此,Camera的拍照方向與上述的Camera的圖像Sensor方向一致。


為了演示這個(gè)問(wèn)題,我用手機(jī)的Camera對(duì)同一個(gè)場(chǎng)景拍了兩張照片,第一張是橫著拿手機(jī)拍的,第二張是豎著拿手機(jī)拍的。然后用在電腦上打開(kāi)得到的圖片(實(shí)際場(chǎng)景中的杯子是豎著的),效果如下所示:


Android開(kāi)發(fā)實(shí)踐:掌握Camera的預(yù)覽方向和拍照方向


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


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


上面說(shuō)了,對(duì)于橫屏應(yīng)用,不需要額外設(shè)置這個(gè)方向,但是對(duì)于豎屏應(yīng)用,則需要調(diào)用setDisplayOrientation(90),來(lái)保證Camera的預(yù)覽方向與Activity的方向一致,那么設(shè)置了這個(gè)函數(shù)究竟會(huì)不會(huì)影響到Camera拍照的結(jié)果呢?根據(jù)上面的分析,理論上應(yīng)該是不影響的,因?yàn)榕恼盏玫降膱D片方向是與圖像Sensor的方向一致的,當(dāng)然,我們可以通過(guò)Android官方API的注釋文檔驗(yàn)證一下這個(gè)猜想,下面是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);


重點(diǎn)看這兩句話:


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.


由此我們得到驗(yàn)證了,這個(gè)API修改的僅僅是Camera的預(yù)覽方向而已,并不會(huì)影響到PreviewCallback回調(diào)、生成的JPEG圖片和錄像文件的方向,這些數(shù)據(jù)的方向依然會(huì)跟圖像Sensor的方向一致。


關(guān)于Android Camera的預(yù)覽和拍照方向的介紹就到這里了,希望對(duì)Camera應(yīng)用開(kāi)發(fā)的新手們能有所幫助,有任何疑問(wèn)歡迎留言或者來(lái)信lujun.hust@gmail.com交流,或者關(guān)注我的新浪微博 @盧_俊 獲取最新的文章和資訊。


向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI