關於SurfaceView相機預覽獲取Bitmap的方法

昨天在網上找了好久SurfaceView截屏方法,canvas轉bitmap方法...... 發現國內網站上太多坑了!!!Google上也有一些,沒有在Google上找到合適的方法,多是我找到後面煩躁了吧,Google上的沒有仔細看.java

這篇不解決canvas轉bitmap的的問題,不解決SurfaceView截屏的問題,解決的是相機預覽時獲取Bitmap,用的可不是takePicture方法canvas

還有就是由於我的代碼存在的問題,致使PreviewCallback沒有被調用,文末給出瞭解決辦法.數組

我用的方法是經過ide

Camera.setPreviewCallback(mPreviewCallback);

而後在Camera.PreviewCallback類自動實現的網站

public void onPreviewFrame(byte[] data, Camera camera)

方法中獲取data,構成Bitmap.spa

給出我在代碼中的previewCallback,生成Bitmap的過程不必定要以下方法寫.其餘方法本身去試吧.net

private Camera.PreviewCallback mPreviewCallback = new Camera.PreviewCallback() {
        @Override
        public void onPreviewFrame(byte[] data, Camera camera) {
            
            Camera.Size localSize = camera.getParameters().getPreviewSize();  //得到預覽分辨率
            YuvImage localYuvImage = new YuvImage(data, 17, localSize.width, localSize.height, null);
            ByteArrayOutputStream localByteArrayOutputStream = new ByteArrayOutputStream();
            //把攝像頭回調數據轉成YUV,再按圖像尺寸壓縮成JPEG,從輸出流中轉成數組
            localYuvImage.compressToJpeg(new Rect(0, 0, localSize.width, localSize.height), 80, localByteArrayOutputStream);
            mParamArrayOfByte = localByteArrayOutputStream.toByteArray();
            //生成Bitmap
            BitmapFactory.Options localOptions = new BitmapFactory.Options();
            localOptions.inPreferredConfig = Bitmap.Config.RGB_565;  //構造位圖生成的參數,必須爲565。類名+enum
            mCurrentBitmap = BitmapFactory.decodeByteArray(mParamArrayOfByte, 0, mParamArrayOfByte.length, localOptions);
  
        }
    };

 

注意,不須要錄製視頻,因此不調用Camera.unlock(),以前由於調用了這個方法,致使PreviewCallback沒有被調用.迷途很久! code

本博客原地址:http://my.oschina.net/reone/blog/733316視頻

相關文章
相關標籤/搜索