一、 摄像头组件
1、(自定义类CMyCamera),继承于CBase类和MCameraObserver类实现是该M类里面的虚函数。定义一个CCamera的成员变量
2、CCcamera类,
3、MCameraObserver类
二、 创建摄像头的步骤
1、 创建摄像头实例
调用了Camera::NewL()。
static IMPORT_C CCamera *NewL(MCameraObserver &aObserver, TInt aCameraIndex);
aObserver 摄像头观察者的引用。(MCameraOberver的引用)
aCameraIndex是摄像头设备编号(使用时必须保证该摄像头是有效的)
为方便使用Camera提供了静态函数CamerasAvailable(),用过该函数可以获得手机可用摄像头个数 可取0-- CamerasAvailable()-1之间任意一个整数。
2、 保留(创建)摄像头
Camera实例后 调用Camera::Rrserve()函数来保留摄像头。以保证对摄像头的独占访问
3、 打开摄像头电源
ReserveComplete(aError)aError是KErrInUse说明摄像头已经被占用,返回KErrNone说明保留成,如果保留摄像头成功我们就可以通过掉用Camera::PowerOn()打开摄像头电源了
4、 设置摄像头参数
如果成功的打开了摄像头电源那么我门就可以设置一些摄像头的参数了
先掉用Camera::CameraInfo(),获得信息的摄像装置 TCameraInfo 结构指明了摄象头对各个参数的主持程度。
1)对比度设置SetContrastL()
设置的调整装置的对比。
这一定是在这个范围的- 100到+ 100或EContrastAuto。与KErrNotSupported离开如果指定的对比数值的范围。
2)设置高亮SetBrightnessL()
设置高亮度调节装置。
如果没有效果并不支持这一点,看TCameraInfo:iBrightnessSupported。
这一定是在这个范围的- 100到+ 100或EBrightnessAuto。可能留下的亮度调节KErrNotSupported的范围。
3)设置缩放SetDigitalZoomFactorL()
设置这个数字变焦因子。
这一定是在0到TCameraInfo:iMaxDigitalZoom包容。
可能留下的放大因子KErrNotSupported的范围。
4)设置曝光模式SetExposureL()
设定曝光调整装置。
如果没有效果并不支持这一点,看CameraInfo:iExposureModesSupported。
可能留下如果指定的暴露KErrNotSupported调整是无效的。
Enum TExposure
{
EExposureAuto = 0x00 自动模式,这是缺省模式。
EExposureNight = 0x01 夜间模式,曝光模式较长。
EExposureBacklight = 0x02 背光模式,适合在背光模式比较亮时使用。
EExposureCenter = 0x03 中间模式,忽略掉周围环境的影响。
}
5)设置闪光模式SetFlashL()
设置闪光模式。
如果没有效果并不支持这一点,看TCameraInfo:iFlashModesSupported。
与KErrNotSupported离开如果指定的闪光的模式是无效的。
{
EFlashNone =0x00 无闪光
EFlashAuto =0x01 自动模式,有需要的时候会自动闪光。
EFlashForced =0x02 强制模式,任何时候都会有闪光灯。
EFlashFillIn =0x04 填充模式,在正常光照下会减弱闪光强度。
EFlashRedEyeReduce =0x08 防红眼模式,减小或阻止图片上的人物像的红眼出现
}
经过以上的四个步骤 之后,就可以使用摄像头取景,捕捉图像和视频了。
显示取景器
ECam Api 支持两种显示取景器的方法(一种是DSA直接屏幕访问,另一种位图显示模式)。
1、直接屏幕访问
使用这种方法的时候,应用程序只要指明要使用屏幕上的那个区域,由摄像头把当前取的景直接绘制到这个区域上。
DSA显示模式
在显示模式下调用StartViewFinderDirecL()函数启动取景器,他的原型是
Virtual void StartViewFinderDirectL(RWsSession &aWs, CWsScreenDevice &aScreenDevice, RWindowBase &aWindow, TRect &aScreenRect)=0;
第一个参数 RWsSession当前窗口服务器对话的引用,
第二个参数 CWsScreenDevice 当前屏幕设备的引用,
第三个参数 RWindowBase 窗口的引用,
第四个参数 TRect 以屏幕坐标指定的屏幕矩形。
另一个重载的StartViewFinderDirectL函数还可以制定一个剪裁区的矩形。
注意!!使用DSA显示模式时,取景器一旦启动窗口上就立即显示图像。
2、位图显示
由摄像头提供一系列的位图,而应用程序负责位图的绘制。摄像头可能只支持其中一种方法,也可能两者都支持,所以在使用取景器之前首先调用CCamera::CameraInfo()函数,根据根据函数返回的TCameraInfo结构的iOptionsSupported数据成员确定摄象头支持那种方法。
Enum TOptions
{
EViewFinderDirectSupported 直接将取景器显示在屏幕上
EViewFinderBitmapsSupported 取景器产生位图,然后由应用程序进行绘制
EVideoCaptureSupported 静态图像捕捉
EVideoCaptureSupported 视频捕捉
EViewFinderMirrorSupported 取景器镜像显示
}
位图显示模式下调用StartViewFinderBitmapL()函数启动取景器,他的原型
virtual void StartViewFinderBitmapsL(TSize &aSize)=0;
参数TSize 指定了位图中所要显示的区域,一般来说最好调用EnumerateCaptureSize()函数作为摄象头选择一个标准的捕捉尺寸。
virtual void StartViewFinderBitmapsL(TSize &aSize, TRect &aClipRect)=0;
调用StartViewFinderBitmap程序会回调MCameraObserver::ViewFinderFrameReady().
If PowerOn() has not been called, or has not yet completed
当取景器以位图的模式启动后,每当摄像头获取一帧图像,ECam就会调用观察者的ViewFinderFrameReady()函数将这帧图像传回给应用程序,有应用程序决定是否显示改帧图像。
关闭取景器
调用Camera->StopViewFinder()
图像捕捉
EnumerateCaptureSizes
virtual void EnumerateCaptureSizes(TSize &aSize, TInt aSizeIndex, TFormat aFormat) const=0;
aSizeIndex函数根据指定的尺寸索引和图像格式给出摄象头支持的捕捉尺寸。
思春索引是介于一个0到(TCameraInfo::iNumImageSizesSupported-1)之间的整数值,检查所有尺寸索引并选取最合适的尺寸。
TFormat 图像格式是一个CCamera::TFormat类型的枚举值,可以从TCameraInfo::iImageFormatsSupported获取这个值。