Symbian S60 Camera引擎
//在S60v2上验证,Nokia系列手机都没有问题
今天没什么事情,写篇S60的Camera的文章给大家参考一下,S60Camera主要是通过操作CCamera来获取Camera的信息并操作Camera来启动关 闭Camera,逻辑上还是有些麻烦的,所以我封装了一个CCamEngine简化了逻辑和调用,CCamEngine是封装了对camera的所有操 作,并提供了简单的易用的接口,方便应用的集成和操作,定义的Camera内部状态:ECamError, ECamOff, ECamInit, ECamReserve, ECamPowerOn, ECamActive, ECamStandby;
主要的接口如下: StopPreview() StartPreview() OpenCam() CloseCam() TakePicture(), CCamEngine继承MCameraObserver,里面代码不是很多,主要是对Camera逻辑上的控制,采用Observer模式,在 Camera变化时候通过Observer来驱动View完成预览、拍摄、缩放等工作;
Camera驱动示意:
// Active
// PowerOn
// Reserve
// Off
开启Camera是从off -> Reserve -> PowerOn -> Active,关闭时候正好相反,Error/Init/Standby是属于Engine的状态,代码:
---------------------------------------------------
void CCamEngine::OpenCam()
{
if(iState == ECamError || iState == ECamOff)
{
SetState(ECamInit);
iCamera->Reserve(); //异步回调ReserveComplete
}
}
void CCamEngine::CloseCam()
{
switch(iState)
{
case EActive:
StopPreview();
case EPowerOn:
iCamera->PowerOff();
case EReserve:
iCamera->Release();
case EOff:
iState = EOff;
break;
}
}
void CCamEngine::StopPreview()
{
if(iCamera->ViewFinderActive())
iCamera->StopViewFinder();
}
void CCamEngine::TakePicture()
{
iCamera->CaptureImage();
}
void CCamEngine::StartPreview()
{
if(GetState() > ECamOff )
{
if(!iCamera->ViewFinderActive())
{
iCamera->StartViewFinderBitmapsL(iPreviewSize);
SetState(ECamActive);
}
}
}
void CCamEngine::ReserveComplete(TInt aError)
{
if(aError == KErrNone)
{
SetState(ECamReserve);
//启动camera
m_pCamera->PowerOn(); //异步回调, PowerOnComplete
}
else
{
CloseCam();
if (aError == KErrInUse)
iObserver.HandleError(aError);
else
iObserver.HandleError(KErrCamCritical);
SetState(ECamError);
}
}
void CCamEngine::PowerOnComplete(TInt aError)
{
if(aError == KErrNone)
{
SetState(ECamPowerOn);
iObserver.PowerTurnedOn();
}
else
{
CloseCam();
iObserver.HandleError(KErrCamCritical);
SetState(ECamError);
}
}
void CCamEngine::ImageReady(CFbsBitmap* aBitmap, HBufC8* /*aData*/,TInt aError)
{
// 显示aBitmap图到屏幕上,通过Gc可以完成预览图的显示,aBitmap是属于系统的,不需要手工删除;
// 在设备播放一段时间后可能图像会出现跳动,一般是由于来不及处理,可以选择抛弃几个frame,使得ViewFinder看起来比较平滑;
//
}
一般S60的Camera还带了一些特殊的功能,如:
iCamera->SetDigitalZoomFactorL(aValue); //数字缩放
iCamera->SetFlashL(aValue); //闪光灯
iCamera->SetBrightnessL(aValue); //明亮度
iCamera->SetContrastL(aValue); //明亮度
iCamera->SetExposureL(aValue); //曝光
iCamera->SetWhiteBalanceL(aValue); //白平衡
iCamera->PrepareImageCaptureL(CCamera::EFormatFbsBitmapColor16M, aValue); //在capture前必须设置静态图大小和格式
这 些特性并非所有的camera驱动都支持的,在使用时候必须检查硬件信息,CameraInfo里面可以看到是否支持该特性,如做 DigitalZoom,就必须对不同的设备做不同的缩放等级,不同的机型一般都不相同的,如果需要兼容不同的设备还需要根据设备的id来做不同的配置。