最近在研究Camera的一些属性,在此把亲测的一些属性跟大家分享。
首先Camera 开发的流程基本 如下(两种):
第一种(初学:直接显示在surfaceview)
1.需要一个surfaceview
2.在权限允许和surfaceview oncreate成功后 打开camera,并且把 surfaceview的holder设置在camera的setDisplayPreview上(记得setDisplayOrientation哦,否则画面是横屏)。
3.为Camera设置一些Camera.Parameters,之后startPreview
4.切记,在onResume时执行以上3步操作,并且在onPause时stopPreview、releaseCamera,否则Camera被占用,其他程序无法使用相机。
第二种(进阶:previewcallback获取yuv数据,自己画在surfaceview上),
1.与第一种的区别就是不把surfaceview的holder设置给camera,而是camera 设置一个 surfacetexture(与 surfaceview的区别就是不显示,只接受数据)
2.设置previewCallback,这里边有点学问,camera必须将获取的每一帧数据传给surfaceview或者surfacetexture,previewCallback才会进入,所以这两者必须设置一个,由于我们第二种方式是获取yuv数据,之后画在surfaceview上,所以这里设置surfacetexture。
3.previewCallback获取到yuv数据(这里previewFormat需要设置NV21(YUV420SP),NV21一般是手机默认的format),通过 yuv与argb转化,得到argb,通过surfaceview绘制线程,将argb数组绘制到surfaceview的canvas上,由于这里得到的argb数据还是横屏的,而且大小是previewsize,所以要对canvas进行平移、旋转、缩放。
好了,经过以上设置,就可以预览一个camera的preview了,之后我们可以进行takePicture和videorecording,具体看api如何实现吧,这里我就不多说啦。现在我们开始切入正题,让人蛋碎的Camera.Parameters。
切记!使用任何属性时,凡是有support检测,都要检测一下!
有时setParameters之后相机不显示,那就应该是哪个属性该手机不支持!
1.String flatten() 与 void
unflatten(String flattened)
Camera.Parameters与String互相转化,可用作存储Parameters。
2.get() getInt() 与 set()(key & value形式)API 1即有
最原始的设置Camera.Parameters方式,低API使用,不推荐使用这种方式设置,由于不同厂商的 key value形式不一样,适配性差。
3 . Antibanding
名字不太好说,就是camera看光源(屏幕)的时候,由于不同国家的交流电频率不一样,50Hz(中国),60Hz,如果设置不当,浏览图像上会有条纹。
String
String
List
public static final String ANTIBANDING_50HZ
public static final String ANTIBANDING_60HZ
public static final String ANTIBANDING_AUTO
public static final String ANTIBANDING_OFF
4.一些Lock
特点:锁住了(set true)则设置相关属性就没用了,就算stopPreview也没办法接触,设置false获取release Camera可以解除。需要在startPreview之后调用。使用时基本都要提前判断 isSupport xxxxx。
自动曝光锁
public boolean isAutoExposureLockSupported ()
public boolean getAutoExposureLock ()
public void setAutoExposureLock (boolean)
自动白平衡锁
public boolean isAutoWhiteBalanceLockSupported ()
public boolean getAutoWhiteBalanceLock ()
public void setAutoWhiteBalanceLock (boolean)
5.曝光补偿
public int getExposureCompensation ()
public void setExposureCompensation (int)
(下边这两个方法如果返回0就说明不支持曝光补偿)
public int getMinExposureCompensation ()
public int getMaxExposureCompensation ()
public float getExposureCompensationStep ()
public float setExposureCompensationStep (float)
EV(曝光补偿值) = ExposureCompensation / ExposureCompensationStep;
曝光区域(设置之后才可以获取到,很多手机不支持)
public List<Camera.Area> getMeteringAreas ()
public void setMeteringAreas (List<Camera.Area> meteringAreas)
public int getMaxNumMeteringAreas ()
*需要设置曝光。
*List.size 必须小于 MaxNumMeteringAreas。
*(-1000,-1000)左上角到(1000,1000)右下角;
*与DisplayOrientation无关,所以如果旋转,由于坐标系不变,需要转换区域;
*Camera.Area除了一个Rect区域,还有一个weight;对于重叠区域,相同weight,区域小的享受曝光
*无论zoom设置多少,可视区域都是-1000 ~ 1000。
*需要在startPreview开始之后。
6.闪光模式
public String getFlashMode ()
public void setFlashMode (String value)
public List<String> getSupportedFlashModes ()
关闭
FLASH_MODE_OFF
- 自动
FLASH_MODE_AUTO
- autoFocus和照相时
FLASH_MODE_ON
- red-eye减少时
FLASH_MODE_RED_EYE
- 一直亮着
FLASH_MODE_TORCH
7.焦距(获取相机属性 单位:毫米)
public float getFocalLength ()
8.聚焦(设置之后才可以获取到,很多手机不支持)
聚焦区域(见getMeteringAreas解释)
public List<Camera.Area> getFocusAreas ()
public void setFocusAreas (List<Camera.Area> focusAreas)
聚焦距离(与手机有关)
public void getFocusDistances (float[] output)
*output 必须为float[3],将会赋值以下三种距离(单位:米)。
FOCUS_DISTANCE_NEAR_INDEX
FOCUS_DISTANCE_OPTIMAL_INDEX
FOCUS_DISTANCE_FAR_INDEX
- Far focus
distance >= optimal focus distance >= near focus distance
聚焦模式
public String getFocusMode ()
public void setFocusMode (String value)
public List<String> getSupportedFocusModes ()
*调用autofocus时起作用:FOCUS_MODE_AUTO
FOCUS_MODE_MACRO
- *不聚焦(调用autoFocus无效):
FOCUS_MODE_INFINITY
- *不一定有的模式(调用autoFocus无效):
FOCUS_MODE_FIXED
FOCUS_MODE_EDOF
- *自动聚焦,若调用autoFocus,需要在callback cancelAutoFocus,否则无法继续聚焦:
FOCUS_MODE_CONTINUOUS_VIDEO
FOCUS_MODE_CONTINUOUS_PICTURE(聚焦速度大于Video)
9.缩放
使用前需要判断isZoomSupported
zoom scale by 100,从 100 开始
public int getZoom ()
public void setZoom (int value)
public boolean isZoomSupported ()
从100开始到MaxZoom获取全部Zoom值
public List<Integer> getZoomRatios ()
10.Preview预览区域
*Preview输出格式(见ImageFormat,如 NV21 即 YUV420SP)
public int getPreviewFormat ()
public void setPreviewFormat (int pixel_format)
public List<Integer> getSupportedPreviewFormats ()
*Preview尺寸(我们需要通过getSupportedPreviewSizes设置与SurfaceView宽高比例相近,并且大小相近的尺寸,否则预览会失真变形)
public Camera.Size getPreviewSize ()
public void setPreviewSize (int width, int height)
public List<Camera.Size> getSupportedPreviewSizes ()
*Preview绘制频率(int[2],min与max位置不固定,因手机而定,不要设置错)
public void getPreviewFpsRange (int[] range)
public void setPreviewFpsRange (int min, int max)
public List<int[]> getSupportedPreviewFpsRange ()
这次分享我们就先分享这么多,下一节我们会分享一些 Pictrue Video相关的Parameters和 SceneMode、ColorEffect、WhiteBalance这些效果。
针对 focusAreas和meteringAreas本人是用android5.0 6.0测试的,看不到任何效果,经过查阅,也只能得到手机不支持的结果,也可能是Android版本的问题。这一点如果有某位神有见解,欢迎留言~