1. 程式人生 > >android攝像頭開發,將Camera.onPreviewFrame裡面的data轉換成bitmap

android攝像頭開發,將Camera.onPreviewFrame裡面的data轉換成bitmap

最近在做的幾個專案都和攝像頭有關,其中不乏影象識別的,但是拍照識別有時候感覺還是有些low,直接把畫面一對準自己就識別了多好,就像zxing掃描二維碼一樣,於是上網查了很多資料,找到了

需要給camera物件設定一個 Camera.PreviewCallback,在這個回撥中實現一個方法onPreviewFrame(byte[] data, Camera camera)

當然如果我們設定camera.setPreviewCallback(callback);在設定後onPreviewFrame這個方法會被一直呼叫,我們可以在攝像頭對焦成功夠設定

camera.setOneShotPreviewCallback(previewCallback);

如果這樣設定onPreviewFrame這個方法就會被呼叫一次,我們只要將其中的data取回做成bitmap來做相應的處理就行了

那麼有人問了,為什麼不在對焦成功後拍照呢,因為拍照後畫面會頓一下,無論你再怎麼設定那幾個引數時間(具體名字忘了),也會有相當短暫的停頓,所以要藉助onPreviewFrame這個方法來獲取影象,那麼直接上onPreviewFrame這個方法的程式碼吧

Bitmap bitmap;
    public void runInPreviewFrame(byte[] data, Camera camera) {
        bitmap = BitmapFactory.decodeByteArray(rawImage, 0, rawImage.length, options);
    }
我靠,就這個簡單的幾行程式碼樓主跟這墨跡這麼半天?別急,如果不出意外的話,一部分人如果只是直接用BitmapFactory.decodeByteArray這個方法的話,應該有一部分會報錯:

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要及時回收哈
艾瑪,下班了,提交文章走人了,下班著急了,文章寫不好,哈哈,自己能看懂得了~