android自制相机

上传人:小** 文档编号:134147373 上传时间:2022-08-12 格式:DOC 页数:8 大小:100.50KB
收藏 版权申诉 举报 下载
android自制相机_第1页
第1页 / 共8页
android自制相机_第2页
第2页 / 共8页
android自制相机_第3页
第3页 / 共8页
资源描述:

《android自制相机》由会员分享,可在线阅读,更多相关《android自制相机(8页珍藏版)》请在装配图网上搜索。

1、功能要求:利用系统提供的包自制相机应用,可以完成拍照,保存,切换前后摄像头以及添加滤镜的任务。利用androidhardwareCamera类完成1. 授权首先,需要授权。需要自动对焦功能的话,还需要:2. 用XML进行布局放入一个名为camera的再放入一个名为image的3. 创建一个Activity同时实现SurfaceHolder.Callback接门。SurfaceHolder.Callback是用于接受发生在SurfaceView中变化的信息SurfaceHolder.Callback实现三个函数:surfaceChanged当surface的人小或是尺寸变化的时候调用surfac

2、eCreated当surface被创建时调用surfaceDestroyed当surface被毁坏时调用4. 写onCreate()函数getWindow()setFormat(PixelFormatTRANSLUCENT);requestWindowFeature(WindowFEATURENOTITLE);getWindow()setFlags(WindowManagerLayoutParamsFLAG_FULLSCREEN,WindowManagerLayoutParamsFLAG_FULLSCREEN);屏幕显示设为半透明,全屏(没有Noticification),没有标题setCon

3、tentView(Rayout.main);mSurfaceView=(SurfaceView)findViewByld(R.id.surface_camera);设置布局为main.xml获得布局中SurfaceView的实例mSurfaceHolder=mSurfaceViewgetHolder();mSurfaceHolderaddCallback(this);mSurfaceHoldersetType(SurfaceHolderSURFACE_TYPE_PUSH_BUFFERS);从surfaceview获得holder的实例;通过给holder的实例增加回调函数来控制surfacev

4、iew:并设置surface的type(deprecated,可以被自动设置)5. 补全回调函数publicvoidsurfaceCreated(SurfaoeHolderholder)/TODOAuto-generatedmethodstub/创建一个Camera实例打开设备的第一个背而摄像头mCamera=Cameraopen();mCamerasetPreviewCallback(mPreviewCallback);try/设置surface用来显示实时的预览mCamerasetPreviewDisplay(holder);catch(IOExceptione)eprintStackTr

5、ace(); publicvoidsurfaceChanged(SurfaceHolderholder,intformat,intwidth,intheight)if(mPreviewRunning)/停止相机功能mCamerastopPreview();/获取Camera.Parameters的实例Camera.Parametersparameters=mCamera.getParameters();/设置预览相片的维度,需要考虑屏幕朝向parameterssetPreviewsize(mDisplayWidth,3*mDisplayHeight/4);/需要APILEVEL8paramet

6、erssetPreviewFormat(ImageFormatRGB_565);/设置成像格式一/设置camera的参数mCamerasetParameters(parameters);/开始捕获并显示帧mCamerastartPreview(); publicvoidsurfaceDestroyed(SurfaceHolderholder)if(mCamera!=null)/停止相机功能mCamerastopPreview();mPreviewRunning=false;/断开并释放camera实例,必须执行mCamerarelease();mCamera=null;6. 捕获照片给按钮加监

7、听,点击后调用publicfinalvoidtakePicture(nwra.ShuttarCallbackshutter,CamQra.PicturQCallbackra纠Canwra.PicturQCallbackjpeg)其中Camara.ShutterCallback是拍照完成后的回调动牝;CamQra.PictuwCallback是拍摄的未压缩原数据的回调动作,可以为nu;Camera.PictureCallback是对JPEG图像数据的回调动作。 按钮触发的函数:mCameratakePicture(mShutterCallback,null,mPictureCal丄back);

8、对JPEG图像数据的回调动作:PictureCallbackmPictureCallback=newPictureCallback()OverridepublicvoidonPictureTaken(bytedata.CameramCamera)Logv(nPictureCallback,H.onPictureTaken.H);if(data!=null)mBitmap=BitmapFactorydeoodeBytze&rrwy(data,0,data.length);/data只是图片的字节,利用BitmapFactory转化为位图/设置Imageview显示刚获得图片mImageView2

9、setlmageBitmap(mRevisedBitMap);mImageView2setVisibility(ViewVISIBLE);/设置Surfaceview为隐藏mSurfaceViewsetvisibility(ViewGONE);/停止相机获取实时图像if(mPreviewRunning)mCamerastopPreview();mPreviewRunning=false;;照相完成的回调动作ShutterCallbackmShutterCallback=newShutterCallback()publicvoidonShutter()/justlog9donothingLogv

10、(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;Filemy

11、CaptureFile=newFile(fileName);tryBufferedOutputStreambos=newBufferedOutputStream(newFileOutputStream(myCaptureFile);mRevisedBitMapcompress(BitmapCompressFormatJPEG,100,bos);bosflush();bosclose();catch(Exceptione)8. 切换前后摄像头(未测试)思路:1) 先跑判断系统的版本号2) 如果APl=9的话,再获得摄像头总数:=9)Camerainfocamerainfo=newCamerain

12、fo();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); 为获取

13、更多的相机滤镜,需要自己编写查看了系统文档,发MrsetPreviewCallBackO,功能是为每一帧图像增加回调,处理并显基本思路:1) 给cantera设置setPzeviewCallBack2) 获得每帧的数据,解码为RGB编码3) 用新数据获得位图4) 对位图进行图像处理,反光等等5) 将处理后的位图显示在imageview在surfaceCreated函数中,cameraopen()以后力nA;mCamerasetPreviewCallback(mPreviewCallback);回调处理函数PreviewcallbackmPreviewCallback=newPreviewCal

14、lback()OverridepublicvoidonPreviewFrame(bytedata.Cameracamera)/TODOAuto-generatedmethodstubif(data!=null)CameraParametersparameters=cameragetParameters();parameterssetPreviewFrameRate(50);/设置每秒取的帧数intw=parametersgetPreviewSize()width;inth=parametersgetPreviewSize()height;Logd(TAG,HmPreviewCallbackw=

15、n+w+Hh=H+h);intmByteArray=newintw*h*3;/设置空的图像RGB数组,用于接收转化后的数据/YUV编码数据转化为RGBdecodeYUV42OSP(mBytekrrayrdatafw,h);mBitmap=null;mBitmap=BitmapcreateBitmap(mByteArray,wzh,Bitmap.ConfigARGB_8888);/将由像处理函数放在另外的线程中handler.post(newMyRunnable();mImageView2setlmageBitmap(mRevisedBitMap);mImageView2setvisibilit

16、y(ViewVISIBLE);;10. 图像的处理步骤:1Getbitmap2. createamutablebitmap3Constructacanvaswiththespecifiedbitmaptodrawinto4.CreateaPaintclasswhichisusedtoholdthestyleandcolorinformationabouthowtodrawgeometries,textandbitmaps5用相应的paint在canvas画出bitmap举例:应用colorMatrix做颜色处理publicstaticBitmapdarkMap(Bitmapbitmap)/获得

17、原始图像的长宽intwidth=bitmap.getWidth();intheight=bitmapgetHeight();/设置颜色效果,该矩阵为底片效果floatcolorEffecnewfloat-1/0,0,0,255,0,-1/0,0,255,0,0z-1/0,255,0,0z08才行。电脑的sdk是2.3的而手机是2.1的,所以运行不了解决:先判断系统版本,API8时再执行camerainfo等函数备注:未测试2.问题:从setPreviewCallback返回的datm做成的bitmap总是返回空分析:查看文档及上网查找后发现,setPreviewCallback返回的dm3并不

18、是RGB,而是YUV420编码。这就需要将他先解码到RGB。比较简便的方法是用系统提供的YuvTmmge类,但是需要API7,所以只能自己找解码方式。解决:利用decodeYUV420SP()解码,然后再做bitmap备注:丄.B辻mapFactory.decodeByteArray函数的那个数组指的是图片数据,不仅仅是RGB数据,还得包含头由于位图定义的基础,16位的位图并不是rgb565,而是rgb5551,所以用这种方式创建位图,就不能使用rgb565数据,只能使用rgb24或者argb32数据3. 问题:返回花屏,或是一帧正常一帧花屏分析:上网查找资料,发现可能是尺寸的设置问题。于是把返回的尺寸写进logcat,发现每次surfaceChanged返回的图像大小交错变化解决:根据屏幕大小设置.尺寸parameters.setPreviewSize(176,144);备注:无4. 问题:图片尺寸大时,显示的图像太卡分析:处理得太慢。解决:减小图片尺寸到128*96,放大immgeView尺寸,这样显示的时候比较流畅parameterssetPreviewsize(128,96);同时获取实时影像但不显示,点击拍照以后显示实际大小的图片,还可以保存。parameterssetPicturesize(480,320);备注:图片不清晰

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!