关于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视频

相关文章
相关标签/搜索