Android Camera实现毫秒级拍照实例
我们知道自定义Camera需要以下几步
- 打开相机,即实例化Camera对象,Cameracamera=Camera.open();
- 设置Camera的相关参数,Camera.Parametersparameters=camera.getParameters();
- 打开预览,camera.setPreviewDisplay(surfaceholder);camera.startPreview();
- 获取图片,这里只是从预览中获取因此使用,camera.setPreviewCallback(newCamera.PreviewCallback(){……..});
- 停止预览,释放相机,camera.stopPreview();camera.release();
1、打开相机
publicstaticCameraopenFacingBackCamera(){ Cameracam=null; Camera.CameraInfocameraInfo=newCamera.CameraInfo(); for(intcamIdx=0,cameraCount=Camera.getNumberOfCameras();camIdx2、设置相关参数和预览
//定义SurfaceView privateSurfaceViewlocalSurface; //为surfaceHolder添加一个回调监听器 localSurface.getHolder().addCallback(newSurfaceHolder.Callback(){ @Override publicvoidsurfaceCreated(SurfaceHolderholder){ } @Override publicvoidsurfaceChanged(SurfaceHolderholder,intformat,intwidth,intheight){ camera=CameraUtil.openFacingBackCamera(); //设置相机预览旋转角度 camera.setDisplayOrientation(180); if(camera!=null){ Camera.Parametersparameters=camera.getParameters();//获得相机参数 Listsizes=parameters.getSupportedPreviewSizes(); List sizes_pic=parameters.getSupportedPictureSizes(); Camera.Sizecs=sizes.get(0); intmWidth=cs.width; intmHeight=cs.height; parameters.setPreviewSize(mWidth,mHeight); parameters.setPictureSize(sizes_pic.get(0).width,sizes_pic.get(0).height); parameters.setJpegQuality(85);// parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO); parameters.setPictureFormat(ImageFormat.JPEG); camera.setParameters(parameters); try{ camera.setPreviewDisplay(localSurface.getHolder()); camera.startPreview();//开始预览 camera.autoFocus(null);//自动对焦 }catch(IOExceptione){ e.printStackTrace(); camera.stopPreview(); camera.release(); camera=null; } } } @Override publicvoidsurfaceDestroyed(SurfaceHolderholder){ if(camera!=null){ camera.stopPreview(); camera.release(); camera=null; } } }); //设置该SurfaceView自己不维护缓冲 localSurface.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 3、获取图片
privatevoidgetViewImage(){ //设置监听 camera.setPreviewCallback(newCamera.PreviewCallback(){ @Override publicvoidonPreviewFrame(byte[]data,Cameracamera){ Camera.Sizesize=camera.getParameters().getPreviewSize(); try{ YuvImageimage=newYuvImage(data,ImageFormat.NV21,size.width,size.height,null); if(image!=null){ ByteArrayOutputStreamstream=newByteArrayOutputStream(); image.compressToJpeg(newRect(0,0,size.width,size.height),80,stream); Bitmapbmp=BitmapFactory.decodeByteArray(stream.toByteArray(),0,stream.size()); //因为图片会放生旋转,因此要对图片进行旋转到和手机在一个方向上 rotateBitmap(bmp); stream.close(); } }catch(Exceptionex){ Log.e("Sys","Error:"+ex.getMessage()); } } }); }旋转图片的方法
publicvoidrotateMyBitmap(Bitmapbmp){ Matrixmatrix=newMatrix(); matrix.postScale(-1,1);//镜像水平翻转(如果左右颠倒) matrix.postRotate(180); Bitmapnbmp=Bitmap.createBitmap(bmp,0,0,bmp.getWidth(),bmp.getHeight(),matrix,true); imageView.setImageBitmap(nbmp); };自定义时间拍照
privateHandlermHandler=newHandler(){ publicvoidhandleMessage(Messagemsg){ switch(msg.what){ case101: getViewImage(); Log.e(TAG,"handleMessage:拍照"); mHandler.sendEmptyMessageDelayed(102,100); break; case102: camera.setPreviewCallback(null); break; } } };然后点击按钮调用
mHandler.sendEmptyMessageDelayed(101,100);以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。