Symbian 摄像头编程预研
摄像头编程预研
目前使用摄像头编程,网上用的最多的都是直接调用手机自带的照相/摄像程序来完成,不过使用这种方式,可控性就显得弱一些,为此近期对直接使用ECAM API进行了下简单预研。
照相流程
因为本次预研主要还是偏重照相功能。整个照相过程,假设使用文字说明可能会显得相对繁琐,为此结合ECAM API对照相功能进行了顺序流程图描绘,具体如下
该过程主要涉及到的观察器类就是MCameraObserver,该类和CCamera均在ecam.h头文件中被定义,以下是该观察器接口类的声明
class MCameraObserver
{
public:
//CCamera::Reserve异步函数的回调通知
virtual void ReserveComplete(TInt aError)=0;
//CCamera::PowerOn异步函数的回调通知
virtual void PowerOnComplete(TInt aError)=0;
//假如取景器模式为位图模式时预览位图的回调通知
virtual void ViewFinderFrameReady(CFbsBitmap aFrame)=0;
//CCamera::CaptureImage异步函数的回调通知
virtual void ImageReady(CFbsBitmap* aBitmap,HBufC8* aData,TInt aError)=0;
//CCamera::StartVideoCapture异步函数的回调通知
virtual void FrameBufferReady(MFrameBuffer* aFrameBuffer,TInt aError)=0;
};
在这里需要说明下的,恐怕就是取景器了,因为假设不是数码达人或者第一次接触摄像头类编程,这个概念还是比较新的。其实所谓取景器,可以理解为预览拟拍摄景物的视窗,CCamera支持两种显示取景器的方法:一种是直接屏幕访问模式,即应用程序只要指明在屏幕上的哪个区域显示图像,摄像头对象就会把当前取到的图像直接绘制到这个区域上(可以说过程不用程序干预的);另外一种是位图模式,即摄像头对象提供一系列的位图,由应用程序把位图绘制到窗口上。
一般在设置之前需要先获取一下摄像头参数,看看其是否支持所要设置的模式。EViewFinderDirectSuported就是支持直接屏幕访问模式,EViewFinderBitmapsSupported就是位图模式。通常情况下,假如两种模式都支持的情况下,选用直接屏幕访问模式,因为这种模式比较快而且不用程序代码干预,否则就用位图模式,位图模式时,当捕捉到图像后会调用观察器的ViewFinderFrameReady()函数将图像传给观察器进行绘制。
关于CameraInfo
摄像头本身有属性信息,我们可以通过调用CCamera:: CameraInfo(TCameraInfo aInfo)函数获取。对N81手机主摄像头进行缺省参数的提取,具体参数如下图所示
对各自参数的分析如下
iHardwareVersion
相机硬件的版本号,该值不用细究,是OEM关心的
iSoftwareVersion
相机软件的版本号(驱动程序版本号),该值也是OEM关心
iOrientation
相机的朝向,该值是OEM出厂时根据相机特性设定的,编程无法修改,不过可以给我们编程提供参考条件,其取值有如下几种类型
/** Possible directions in which the camera may point.
*/
enum TCameraOrientation
{
/** Outward pointing camera for taking pictures.
Camera is directed away from the user. */
EOrientationOutwards,
/** Inward pointing camera for conferencing.
Camera is directed towards the user. */
EOrientationInwards,
/** Mobile camera capable of multiple orientations.
Camera orientation may be changed by the user. */
EOrientationMobile,
/** Camera orientation is not known. */
EOrientationUnknown
};
根据取得的值的情况,N81的主摄像头朝向为EOrientationOutwards,当然通过对N81和E71主次摄像头信息数据的采集,可知类似N81、E71等双摄像头手机的主摄像头属性都是EOrientationOutwards的,而前面次摄像头属性都EOrientationInwards。从而猜测像N93i这样的手机其摄像头朝向属性应该为EOrientationMobile(因为是猜测,所有还期待有人帮忙验证一下)。根据这个属性,对于双摄像头手机,我们可以编程选中需要使用的摄像头。
iOptionsSupported
同样也是一些无法修改的属性,表明了此摄像头支持的功能,因为该值是个位域的值,通常使用过程中要用位与操作来判断其是否支持某一种属性,具体如下罗列的枚举值
enum TOptions
{
/** View finder display direct-to-screen flag */
EViewFinderDirectSupported = 0x0001,
/** View finder bitmap generation flag */
EViewFinderBitmapsSupported = 0x0002,
/** Still image capture flag */
EImageCaptureSupported = 0x0004,
/** Video capture flag */
EVideoCaptureSupported = 0x0008,
/** View finder display mirroring flag */
EViewFinderMirrorSupported = 0x0010,
/** Contrast sett
- 手机操作系统Symbian系介绍(05-23)
- symbian 术语表(10-10)
- Symbian 入门(09-12)
- 学习Symbian的基本概念(09-12)
- SYMBIAN 字符串操作(09-12)
- 什么是Symbian(09-12)