Camera Parameters API (一)

本文详细介绍了Camera的各种参数设置方法,包括预览配置、聚焦控制、曝光调整等,还讲解了如何利用这些参数提升图像质量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

     最近在研究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版本的问题。这一点如果有某位神有见解,欢迎留言~



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值