android攝像頭開發,將Camera.onPreviewFrame裡面的data轉換成bitmap
阿新 • • 發佈:2019-01-31
最近在做的幾個專案都和攝像頭有關,其中不乏影象識別的,但是拍照識別有時候感覺還是有些low,直接把畫面一對準自己就識別了多好,就像zxing掃描二維碼一樣,於是上網查了很多資料,找到了
需要給camera物件設定一個 Camera.PreviewCallback,在這個回撥中實現一個方法onPreviewFrame(byte[] data, Camera camera)
當然如果我們設定camera.setPreviewCallback(callback);在設定後onPreviewFrame這個方法會被一直呼叫,我們可以在攝像頭對焦成功夠設定
camera.setOneShotPreviewCallback(previewCallback);
那麼有人問了,為什麼不在對焦成功後拍照呢,因為拍照後畫面會頓一下,無論你再怎麼設定那幾個引數時間(具體名字忘了),也會有相當短暫的停頓,所以要藉助onPreviewFrame這個方法來獲取影象,那麼直接上onPreviewFrame這個方法的程式碼吧
我靠,就這個簡單的幾行程式碼樓主跟這墨跡這麼半天?別急,如果不出意外的話,一部分人如果只是直接用BitmapFactory.decodeByteArray這個方法的話,應該有一部分會報錯:Bitmap bitmap; public void runInPreviewFrame(byte[] data, Camera camera) { bitmap = BitmapFactory.decodeByteArray(rawImage, 0, rawImage.length, options); }
SkImageDecoder::Factory returned null;(偷笑)
原因不多說了,就是因為格式問題引起的,需要對data進行一下預處理,不廢話,貼程式碼
ByteArrayOutputStream baos; byte[] rawImage; Bitmap bitmap; public void runInPreviewFrame(byte[] data, Camera camera) { camera.setOneShotPreviewCallback(null); //處理data Camera.Size previewSize = camera.getParameters().getPreviewSize();//獲取尺寸,格式轉換的時候要用到 BitmapFactory.Options newOpts = new BitmapFactory.Options(); newOpts.inJustDecodeBounds = true; YuvImage yuvimage = new YuvImage( data, ImageFormat.NV21, previewSize.width, previewSize.height, null); baos = new ByteArrayOutputStream(); yuvimage.compressToJpeg(new Rect(0, 0, previewSize.width, previewSize.height), 100, baos);// 80--JPG圖片的質量[0-100],100最高 rawImage = baos.toByteArray(); //將rawImage轉換成bitmap BitmapFactory.Options options = new BitmapFactory.Options(); options.inPreferredConfig = Bitmap.Config.RGB_565; bitmap = BitmapFactory.decodeByteArray(rawImage, 0, rawImage.length, options);
//下面對bitmap進行處理
}
最後啊,好習慣,記得bitmap要及時回收哈艾瑪,下班了,提交文章走人了,下班著急了,文章寫不好,哈哈,自己能看懂得了~