美文网首页Android开发程序员Android开发
android:通过相机预览获取预览数据,并将其转为图片方式本地

android:通过相机预览获取预览数据,并将其转为图片方式本地

作者: 881ef7b85f62 | 来源:发表于2019-03-11 20:51 被阅读18次

1、简介
2、camera参数设置
3、布局设置
4、获取预览回调参数
5、常见问题

1、简介

在调用相机时我们经常需要获取预览信息,比如人脸比对时需要将相机的流截取出来转为图片,用于人脸识别。

2、camera参数设置

**2.1 创建Camera对象 **
在Activity的Oncreate()中开启相机;

if(mCamera==null){
if(bfrontSwitch){
mCamera=Camera.open(1);//前置
rotation=270;
}else{
mCamera=Camera.open(0);//后置
rotation=90;
}}

2.2 设置相机参数

mCamera.setDisplayOrientation(90);
parameters=mCamera.getParameters();
parameters.setPreviewFormat(ImageFormat.NV21);//default默认为21,所有手机均支持NV21
parameters.setPreviewSize(WIDHT,HEIGHT);//设置预览分辨率
parameters.setPreviewFrameRate(25);
if(!bfrontSwitch)//后置需要自动对焦,否则人脸采集照片模糊
{
parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
}
mCamera.setParameters(parameters);

注意:在设置该参数时,绝大部分的参数我们是可以通过mCamera.getParameters().XX 获取该手机支持的参数。例如:

List<Camera.Size>s upportedPreviewSizes = mCamera.getParameters().getSupportedPreviewSizes()

可以获取相机支持的预览分辨率。这里PreviewSize是预览的大小,也就是拍照前看到的图片大小;PictureSize是指最终拍摄到的图片的大小,也就是图片的质量。
(2)parameters.getSupportedPreviewFrameRates()获取支持的帧率,一般是25-30,特别是这点不能想当然的填写为1-30

2.3 开启相机回调,启动相机

mCamera.setPreviewCallback(this);//开启Camera预览回调,重写onPreviewFrame获取相机回调
mCamera.startPreview();//开启预览
mCamera.cancelAutoFocus();//聚焦

经过以上三点,我们就完成对于相机参数的设置和开启,理论上我们已经将相机打开,由于需要实时预览,因此我们必须将相机获取到的数据展示出来,这里就需要使用第三点布局的设置,这个布局可以使用SurfaceView实现。

3、布局设置

对于布局的设置比较简单,就是普通的surfaceview布局

<SurfaceView
android:id="@+id/id_surface_view_unlock"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>

在activity的onCreate中设置SurfaceView参数

mSurfaceView=(SurfaceView)findViewById(R.id.id_surface_view);//获取surfaceView控件
mSurfaceHolder=mSurfaceView.getHolder();//获取holder参数
mSurfaceHolder.addCallback(new SurfaceHolderCB());//设置holder的回调

4、获取预览回调参数

在相机预览时,就可以通过设置Camera参数展示界面

mCamera.setPreviewDisplay(mSurfaceHolder);

刚刚提到的回调主要包括以下三个参数

private class SurfaceHolderCB implements SurfaceHolder.Callback{
@Override
public void surfaceCreated(SurfaceHolder holder){
startPreview();
}
@Override
public void surfaceChanged(SurfaceHolder holder,int format,int width,int height){
}
@Override
public void surfaceDestroyed(SurfaceHolder holder){
stopPreview();
}}

startPreview()中我们对相机参数设置,并将holder的回调与相机关联,在stopPreview()执行相机资源的回收。
在第二步的mCamera.setPreviewCallback(this)中设置相机回调预览是我们此篇的重点,通过Activity实现,Camera.PreviewCallback方法,重写onPreviewFrame(byte[]data,Camera camera)获取摄像机的预览参数。

Camera.SizepreviewSize=camera.getParameters().getPreviewSize();
YuvImage image = new YuvImage(data,ImageFormat.NV21,previewSize.width,previewSize.height,null);
ByteArrayOutputStream stream = new ByteArrayOutputStream();
image.compressToJpeg(new Rect(0,0,previewSize.width,previewSize.height),80,stream);
Bitmap bmp=BitmapFactory.decodeByteArray(stream.toByteArray(),0,stream.size());

5、常见问题

注意相机预览获取到的data数据不能直接转为bitmap存储,因为该数据是YUV格式的,需要进行数据转换。

关于Android个方面问题,涉及到大量的概念和知识点,如果没有系统的学习,很容易会杂糅概念而辨识不清,在面试与实际工作中都会遇到困难。如果你从事Android开发,具备1年以上工作经验,希望深入浅出了解Android相关技术、flutter、小程序、性能优化等技术要点,渴望实现技术和职业成长上的双重突破,那么以下福利就很适合你:

福利1 免费直播课程

《腾讯课堂Android高级开发工程师系列直播》

适听人群:Android初、中、高级开发工程师

3.12-3.18 连续7天每晚8点准时直播,持续进行

3月12日:手写可自动感知组件生命周期的事件分发机制

3月13日:Android应用最广知识-注解与代理的故事

3月14日:架构师必备之Android AOP教程

3月15日:Java虚拟机原理大揭秘

3月16日:hook源码实现阿里无闪烁换肤

3月17日:实现安全可靠的Android网络连接

3月18日:设计模式应该如何运用到Android项目开发中

福利2 Android开发资料包

该资料包中主要包括「Java语言进阶与Android相关技术核」、「2)App开发框架知识体系(app亦对象)」、「360° Android app全方位性能调优」、「Android前沿技术」、「NDK 模块开发」等内容,全方位扩充你的知识体系。

进阶视频 技术大纲

想要参与Android进阶免费系列直播课

以及获取Android开发工程师资料包的同学,

点击加入:加入

免费课程,名额有限,先到先得~~

相关文章

网友评论

    本文标题:android:通过相机预览获取预览数据,并将其转为图片方式本地

    本文链接:https://www.haomeiwen.com/subject/jksipqtx.html