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();camIdx
2、设置相关参数和预览
//定义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();
Listsizes_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);
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。