资源预览内容
第1页 / 共8页
第2页 / 共8页
第3页 / 共8页
第4页 / 共8页
第5页 / 共8页
第6页 / 共8页
第7页 / 共8页
第8页 / 共8页
亲,该文档总共8页全部预览完了,如果喜欢就下载吧!
资源描述
功能要求:利用系统提供的包自制相机应用,可以完成拍照,保存,切换前后摄像头以及添加滤镜的任务。利用androidhardwareCamera类完成1. 授权首先,需要授权。需要自动对焦功能的话,还需要:2. 用XML进行布局放入一个名为camera的再放入一个名为image的3. 创建一个Activity同时实现SurfaceHolder.Callback接门。SurfaceHolder.Callback是用于接受发生在SurfaceView中变化的信息SurfaceHolder.Callback实现三个函数:surfaceChanged当surface的人小或是尺寸变化的时候调用surfaceCreated当surface被创建时调用surfaceDestroyed当surface被毁坏时调用4. 写onCreate()函数getWindow()setFormat(PixelFormatTRANSLUCENT);requestWindowFeature(WindowFEATURENOTITLE);getWindow()setFlags(WindowManagerLayoutParamsFLAG_FULLSCREEN,WindowManagerLayoutParamsFLAG_FULLSCREEN);屏幕显示设为半透明,全屏(没有Noticification),没有标题setContentView(Rayout.main);mSurfaceView=(SurfaceView)findViewByld(R.id.surface_camera);设置布局为main.xml获得布局中SurfaceView的实例mSurfaceHolder=mSurfaceViewgetHolder();mSurfaceHolderaddCallback(this);mSurfaceHoldersetType(SurfaceHolderSURFACE_TYPE_PUSH_BUFFERS);从surfaceview获得holder的实例;通过给holder的实例增加回调函数来控制surfaceview:并设置surface的type(deprecated,可以被自动设置)5. 补全回调函数publicvoidsurfaceCreated(SurfaoeHolderholder)/TODOAuto-generatedmethodstub/创建一个Camera实例打开设备的第一个背而摄像头mCamera=Cameraopen();mCamerasetPreviewCallback(mPreviewCallback);try/设置surface用来显示实时的预览mCamerasetPreviewDisplay(holder);catch(IOExceptione)eprintStackTrace(); publicvoidsurfaceChanged(SurfaceHolderholder,intformat,intwidth,intheight)if(mPreviewRunning)/停止相机功能mCamerastopPreview();/获取Camera.Parameters的实例Camera.Parametersparameters=mCamera.getParameters();/设置预览相片的维度,需要考虑屏幕朝向parameterssetPreviewsize(mDisplayWidth,3*mDisplayHeight/4);/需要APILEVEL8parameterssetPreviewFormat(ImageFormatRGB_565);/设置成像格式一/设置camera的参数mCamerasetParameters(parameters);/开始捕获并显示帧mCamerastartPreview(); publicvoidsurfaceDestroyed(SurfaceHolderholder)if(mCamera!=null)/停止相机功能mCamerastopPreview();mPreviewRunning=false;/断开并释放camera实例,必须执行mCamerarelease();mCamera=null;6. 捕获照片给按钮加监听,点击后调用publicfinalvoidtakePicture(nwra.ShuttarCallbackshutter,CamQra.PicturQCallbackra纠Canwra.PicturQCallbackjpeg)其中Camara.ShutterCallback是拍照完成后的回调动牝;CamQra.PictuwCallback是拍摄的未压缩原数据的回调动作,可以为nu;Camera.PictureCallback是对JPEG图像数据的回调动作。 按钮触发的函数:mCameratakePicture(mShutterCallback,null,mPictureCal丄back); 对JPEG图像数据的回调动作:PictureCallbackmPictureCallback=newPictureCallback()OverridepublicvoidonPictureTaken(bytedata.CameramCamera)Logv(nPictureCallback,H.onPictureTaken.H);if(data!=null)mBitmap=BitmapFactorydeoodeBytze&rrwy(data,0,data.length);/data只是图片的字节,利用BitmapFactory转化为位图/设置Imageview显示刚获得图片mImageView2setlmageBitmap(mRevisedBitMap);mImageView2setVisibility(ViewVISIBLE);/设置Surfaceview为隐藏mSurfaceViewsetvisibility(ViewGONE);/停止相机获取实时图像if(mPreviewRunning)mCamerastopPreview();mPreviewRunning=false;;照相完成的回调动作ShutterCallbackmShutterCallback=newShutterCallback()publicvoidonShutter()/justlog9donothingLogv(HShutterCallback,H.onShutter.n);;到此,己经可以显示出相机的实时画而。7. 图像的保存思路:1) 获取当前日期时间,作为文件名2) 判断SD卡是否存在,存在的话获得根日录位置3) 将位图压缩为JPEG格式,写进SD卡中SimpleDateFormatformatter=newSimpleDateFormatDatecurDate=newDate(System.currentTimeMillis();Stringstr=formatterformat(curDate);StringfileName=getSDPath()+H/H+str+Hjpeg;FilemyCaptureFile=newFile(fileName);tryBufferedOutputStreambos=newBufferedOutputStream(newFileOutputStream(myCaptureFile);mRevisedBitMapcompress(BitmapCompressFormatJPEG,100,bos);bosflush();bosclose();catch(Exceptione)8. 切换前后摄像头(未测试)思路:1) 先跑判断系统的版本号2) 如果APl=9的话,再获得摄像头总数:=9)Camerainfocamerainfo=newCamerainfo();for(inti=0;iCamera.getNumberOfCameras();i+)CameragetCameralnfo(i,cameralnfo);if(cameralnfofacing=CamerainfoCAMERA_FACING_FRONT)returni;return-1;/Nofront-facingcamerafoundelsereturn-1;9. 增加效果 相机自带9种效果,包括反光,黑白,红褐色等,使用方法:直接设置相机的parameters即可paramssetColorEffect(CameraParametersEFFECT_NEGATIVE); 为获取更多的相机滤镜,需要自己编写查看了系统文档,发MrsetPreviewCallBackO,功能是为每一帧图像增加回调,处理并显基本思路:1) 给cantera设置setPzeviewCallBack2) 获得每帧的数据,解码为RGB编码3) 用新数据获得位图4) 对位图进行图像处理,反光等等5) 将处理后的位图显示在imageview在surfaceCreated函数中,cameraopen()以后力nA;mCamerasetPreviewCallback(mPreviewCallback);回调处理函数PreviewcallbackmPreviewCallback=newPreviewCallback()OverridepublicvoidonPreviewFrame(bytedata.Cameracamera)/TODOAuto-generatedmethodstubif(data!=null)CameraParametersparameters=cameragetParameters();parameterssetPreviewFrameRate(50);/设置每秒取的帧数intw=parametersgetPreviewSize()width;inth=parametersgetPreviewSize()height;Logd(TAG,HmPreviewCallbackw=n+w
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号