android Camera 设置概述

来源:互联网 发布:假身份证骗网络贷款 编辑:程序博客网 时间:2024/05/22 01:44

 不废话


首先,我们罗列出android 使用相机时涉及的东西:

camera 实例

surfaceview 预览框 

surfaceHolder 帧处理工具

preview size camera 的预览尺寸

picture size camera 拍照后照片的尺寸

CameraInfo 相机信息类

Camera.Paramaeters 相机的参数类

前置后置摄像头  CameraInfor.facing   

CameraId 摄像头的 id

CameraCount 摄像头数量


我们想要用相机,首相我们要了解我们当前手机的摄像头硬件信息,如支持的预览尺寸、图片尺寸、摄像头默认角度等,这些信息的获取就是通过 CameraInfo 类来获取。

大致的流程是:

1、利用 CameraInfo 类 获取摄像头信息

2、 获取相机实例 

3、设置摄像头参数 

4、设置预览控件  

5、开始预览  

6、拍照保存 

7、重新预览 

8、停止预览,释放相机资源


首先 Camera提供了静态方法来获取 摄像头的数量,

这个数量 由 0开始便是对应摄像头的 ID 

<span style="white-space:pre"></span>int numberOfCameras = Camera.getNumberOfCameras();        cameraInfoList=new ArrayList<>(numberOfCamera);        Camera.CameraInfo cameraInfo=null;//摄像头信息的容器        for(int id=0;id<numberOfCamera;id++){            cameraInfo=new Camera.CameraInfo();            Camera.getCameraInfo(id,cameraInfo);            cameraInfoList.add(id,cameraInfo);//在对应索引下加入 摄像头的信息        }

现在我们已经获取了手机所有摄像头的信息 (虽然它可能不超过2个)

下面我们要根据这些信息来选择我们要打开那个摄像头,前置还是后置

在 CameraInfo 这个类中有个属性 cameraInfo.facing  ,这个值标志着摄像头是前置还是后置

下面我们获取摄像头的实例  

 <span style="white-space:pre"></span>if(cameraInfo.facing== Camera.CameraInfo.CAMERA_FACING_BACK){//表明当前摄像头是后置摄像头            camera=Camera.open(id);//获取后置摄像头实例        }else if(cameraInfo.facing== Camera.CameraInfo.CAMERA_FACING_FRONT){//表明当前摄像头是后前置摄像头        }

此时我们已经占有了手机的摄像头资源,如果它没有被占用的话大笑

接下来是重点了 摄像头参数的设置 

包括 预览方向、照片方向、预览尺寸、照片尺寸、照片格式、预览帧率等等; 

想要设置的话我们要先知道,我们的摄像头都支持哪些方向、尺寸、格式;

我们先说尺寸,目前市场上的主流手机 基本都是16:9的屏幕尺寸,如果你的相机想用全屏模式预览的话 就需要在所支持的尺寸中找16:9 尺寸的 并在其中选一个比较合适的分辨率,当然分辨率越高预览画质越好。

以16:9 为例   

首先获取摄像头的 Parameters  

然后获取所支持的所有预览尺寸

        Camera.Parameters parameters = camera.getParameters();        List<Camera.Size> supportPreviewSizes = parameters.getSupportedPreviewSizes();        Camera.Size bestSize = null;        for (Camera.Size size : supportPreviewSizes) {            if (size.height / 16 == size.width / 9) {//比率符合16:9                    bestSize=size;                //这里可以进行预览尺寸的判断  根据你的需要 选择合适的尺寸                            }else {//                continue            }        }

接下来用同样的办法获取我们想要的照片尺寸。为了保证预览与拍照能够展现的一致,我们照片尺寸也选择16:9 ,而保存图片的大小我们也需要一定的选择,我们这里先不管它

  List<Camera.Size> supportPictureSizes = parameters.getSupportedPreviewSizes();        Camera.Size bestSize = null;        for (Camera.Size size : supportPreviewSizes) {            if (size.height / 16 == size.width / 9) {//比率符合16:9                    bestSize=size;                //这里可以进行预览尺寸的判断  根据你的需要 选择合适的尺寸                            }else {//                continue            }        }

好 下面是比较让人头疼的问题了,由于 android 手机的厂商没有同意的标准 所以造成在硬件上有一些不一致,比如这个 camera 的 oriention;

在这个问题上我要强调一点,camera.setOriention()设置的是预览的成像方向,而 camera.parameters.setRotation() 设置的是照片的方向


以我的项目为例    我的华为手机camera 的 orientation 在后置和前置摄像头时 值分别为  90 和 270 ,另一台 Moto 的Nexus 6 则是  90 90   ;

目前我的经验手机在正常使用的姿势时,你的左手边为 camera oriention=0 ,(顺时针 oriention 增加),我们看到假设我们使用后置摄像头,

以华为手机为例   :

此时我获得的 cameraInfo 中 oriention = 90    那么我设置 camera.setDisplayOriention(90);(注意:这个90 和 oriention 的90是纯属巧合 因为竖屏的手机成像就是90 如果你需要的是横屏拍摄 这个值就应该设置为 180 )使得预览的成像与我们看见的是一致的。

正常姿势的手机右手边是 displayOriention=0 逆时针旋转增加角度 垂直向上为90  左手边为 180 正下方为270 ,

所以当你camera.setDisplayOriention(0)的时候,就是告诉系统  预览的时候 人头朝向手机左边哦! 

所以当你camera.setDisplayOriention(90)的时候,就是告诉系统  预览的时候 人头朝向手机正上方哦! 

所以当你camera.setDisplayOriention(180)的时候,就是告诉系统  预览的时候 人头朝向手机右边哦! 

所以当你camera.setDisplayOriention(270)的时候,就是告诉系统  预览的时候 人头朝向手机正下方哦! 


然后我们切换到前置摄像头   oriention =270  这时我要设置 camera.setDisplayOriention(90);么?  错!!如果设置成90 你会看到倒立的预览

为什么是倒立的?

仔细看 倒立的 说明 多旋转或是少旋转了180°  ,对的  在使用前置摄像头时  camera.setDisplayOriention(270+180)才能在正常姿势的手机上看到正常的预览;

camera.setDisplayOriention();形参的范围是-360~360 ;

这样直接加到一起会报错的哦!!   所以   camera.setDisplayOriention((270+180)%360);


接着我们说说 parameters.setRotation()的作用:

简单地说就是 设置你照片的角度了  跟 oriention 的一样  也是 0 90 180 270 分别代表图像底部指向手机的四个方向;

https://github.com/vvweilong/cameraInfor/tree/master  加一个demo 

这个例子可以 点击增加 displayorien ,   点击更改 parameters.rotation 每次增加90,点击切换前后置摄像头,点击拍照 观看 照片的变化。

关于 拍照的照片 始终保持 正立 请听下回分解吧,其实就是 根据手机传感器的变化判断手机的姿态然后更改 rotation 的值 是成像的方向与手机预览相对应而已。


就酱…… 

0 0
原创粉丝点击