很久没写文章了,也是因为这段时间工作上没有遇到一些值得记录的内容。最近有客户提出需求需要我们的SDK提供手动调整对焦和测光区的接口。到今天基本实现了用户的需求,现在记录一下其中的一些难点。SDK代码有点老,基本功能都是基于Camera1实现的,所以以下内容也是针对Camera1。
Camera1上调整对焦和测光有系统现成的API。具体过程如下:
- 先获取
Camera
的Parameters
对象; - 通过
Parameters
的getMaxNumFocusAreas
和getMaxNumMeteringAreas
获取到最大可设置的对焦区和测光区数目,如果是0,则不支持对焦/测光区设置。(一般手机前置摄像头只支持测光区设置,后置摄像头可支持对焦和测光区设置); - 设置
Parameters
的对焦区和测光区(setFocusAreas
setMeteringAreas
)。
这些调用系统API的步骤并不难,难点在于如何计算对焦区域/测光区域,即如何将用户在界面上的触摸点坐标转化成能直接被Camera
利用的区域,特别是横竖屏切换、画面镜像翻转的场景下。
首先我们要了解摄像头硬件的图像传感器默认方向是左横屏,而我们正常的手机使用方向是竖屏的。
同时要了解Camera.Area
的坐标系是这样的:
一句话概括下,就是需要将触摸点的坐标转化成Camera.Area
坐标系(左横屏)下的坐标。
如果空间想象能力优秀,在脑海天马行空一番大概就搞定;否则,拿出纸笔比划一下,也能搞定。
如果画面镜像,比如是前置摄像头自拍的场景,需要对最终计算出来的X坐标也做镜像处理。