您好,登錄后才能下訂單哦!
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í)的左上角:
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)景中的杯子是豎著的),效果如下所示:
由此可見(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)注我的新浪微博 @盧_俊 獲取最新的文章和資訊。
免責(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)容。