Android Camera實現圖像複製

做VR產品的時候,有個產品的目標是做一個左右眼的攝像頭,實現兩個攝像頭採集數據,左右分屏的顯示在手機屏幕上,當時調研發現,手機因爲只有一顆ISP所有一般情況下只能打開一個攝像頭,所以當時考慮可以使用手機的攝像頭外接一個USB camera。由於當時時間比較緊,所以調研過程中只做了屏幕的分屏顯示,而沒有做攝像頭的輸入方式。
當時採用的方法是修改圖形顯卡(framebuffer)的參數,使得圖像在輸出的時候能夠左右分屏,但是不同的平臺下也會出現有的能work有的不work的情況。
所以到現在也沒有很好的解決方案。
最近在學習camera相關知識的時候假想了一種使用場景,使用單個攝像頭完成攝像頭圖像的複製,做一個類似左右眼的效果。

設定的方法是在佈局文件中設定一個surfaceView和一個ImageView:
這裏寫圖片描述
記得之前描述過,我們可以通過onPreviewFrame回調函數拿到data數據。既然如此,我們便可以把這部分數據複製到一份顯示在屏幕上,實現左右分屏。

要注意的是,此處返回的數組圖像格式爲NV21(YUV420SP),並不支持直接BitmapFactory.decodeByteArray()方法,需要進行格式轉換。參考網上的博客https://blog.csdn.net/d276031034/article/details/73276495
//將rawImage轉換成bitmap
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.RGB_565;
bitmap = BitmapFactory.decodeByteArray(rawImage, 0, rawImage.length, options);
最終調用icon.setImageBitmap(bitmap); 將圖像顯示出來。

但是正如原作者所說,顯示的延時現象很明顯。

可以參考網上的多線程的優化方式,https://www.2cto.com/kf/201605/511009.htmlAndroid性能優化典範之多線程篇
我們可以使用HandlerThread的方式來進行實現,
//創建一個HandlerThread並啓動
mHandlerThread=new HandlerThread(“my_handlerthread”);
mHandlerThread.start();
創建handler來啓動我們定義的任務
subHandler=new Handler(mHandlerThread.getLooper());
subHandler.post(newMyTask());
在MyTask中實現具體功能:
classMyTaskimplementsRunnable{
@SuppressLint(“NewApi”)@Override
public void run(){
doChange(surfaceView.getHolder());
}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章