昨天在网上找了好久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