⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cameracaptureengine_3rd_ed.cpp

📁 Symbian智能手机操作系统源代码值的参考_摄像头
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/*
* ============================================================================
*  Name     : CameraCapureEngine.cpp
*  Part of  : CameraApp
*
*  Description : Provides all still image releated methods. 
*                Interface to Symbian Onboard Camera API.
*  Version:
*  Copyright: Nokia Corporation, 2004
* ============================================================================
*/

#include "CameraCaptureEngine_3rd_Ed.h"

#include <AknViewAppUi.h>
#include <eikenv.h>
#include <barsread.h>

// Constants
_LIT( KImageSaved, "Image saved" );
_LIT( KSavingImage, "Saving image..." );

/*
-----------------------------------------------------------------------------

	CCameraCaptureEngine::CCameraCaptureEngine( 
        CCameraAppController& aController)
                    :CActive( EPriorityStandard ),
					iController( aController ), 
                    iZoomFactor( NULL ), iCapturePrepared( EFalse ), 
                    iEncoder( NULL ),
					iFrameImageData( NULL ), iCameraReserved( EFalse )

	Description: C++ default constructor can NOT contain any code that might 
                leave.
	Comments   :

    Return values: N/A

-----------------------------------------------------------------------------
*/
CCameraCaptureEngine::CCameraCaptureEngine( CCameraAppController& aController )
                    :CActive( EPriorityStandard ),
                    iController( aController ), 
                    iZoomFactor( NULL ), iCapturePrepared( EFalse ), 
                    iEncoder( NULL ), iCameraReserved( EFalse )
    {
    CActiveScheduler::Add( this );
    iState = EEngineIdle;
    }

/*
-----------------------------------------------------------------------------

	CCameraCaptureEngine* CCameraCaptureEngine::NewL( 
        CCameraAppController& aController, const TRect& aRect  )

	Description: Two-phased constructor.

	Comments   :

    Return values: CCameraCaptureEngine object pointer

-----------------------------------------------------------------------------
*/
CCameraCaptureEngine* CCameraCaptureEngine::NewL( 
    CCameraAppController& aController, const TRect& aRect )
    {
    CCameraCaptureEngine* self = new (ELeave) CCameraCaptureEngine( aController );
    CleanupStack::PushL( self );
    self->ConstructL(aRect);
    CleanupStack::Pop(self);
    return self;
    }


/*
-----------------------------------------------------------------------------

	CCameraCaptureEngine::~CCameraCaptureEngine()

	Description: Destructor, free allocated resources
	Comments   :

    Return values: N/A

-----------------------------------------------------------------------------
*/
CCameraCaptureEngine::~CCameraCaptureEngine()
    {
    if (iEncoder)
        delete iEncoder;      
    if (iCamera)
        delete iCamera;
    if (iBitmapPortraitVF)
        delete iBitmapPortraitVF;
    if (iBitmapSave)
        delete iBitmapSave;
    // Cancel any outstanding requests
    Cancel();
    }

/*
-----------------------------------------------------------------------------

	void CCameraCaptureEngine::ConstructL(const TRect& aRect)

	Description: Symbian 2nd phase constructor can leave.
	Comments   :

    Return values: N/A

-----------------------------------------------------------------------------
*/
void CCameraCaptureEngine::ConstructL(const TRect& aRect )
    {
    iEikEnv = CEikonEnv::Static();
    if ( !CCamera::CamerasAvailable() )
        {
        HandleError( KErrHardwareNotAvailable );
        return;
        }
        
    iCamera = CCamera::NewL( *this, 0 , 0 );// camera index 0, priority 0

    iCameraReserveComplete = ETrue;//No requests issued yet
    
    // Gets information about the camera device. refer to SDK for more info.
    iCamera->CameraInfo(iInfo); 
    iDisplayMode = DisplayMode();
    iColorDepth = ImageFormat();
    iColorDepthHW = ImageFormatMax();
    // The given client rect size is the same as the landscape picture size
    iLandscapeSize = aRect.Size();
    // In portrait mode the height is the same, but the width needs to be
    // calculated according to the aspect ratio
    iPortraitSize = TSize(
        (aRect.Size().iHeight * aRect.Size().iHeight / aRect.Size().iWidth), 
        aRect.Size().iHeight);

    iBitmapPortraitVF = new (ELeave) CWsBitmap( iEikEnv->WsSession() );
    TInt createError = iBitmapPortraitVF->Create( iPortraitSize, iDisplayMode );
    User::LeaveIfError( createError );
    }

/*
-----------------------------------------------------------------------------

	TDisplayMode CCameraCaptureEngine::DisplayMode() const

	Description: Returns default display mode
	Comments   :

    Return values: Returns default display mode

-----------------------------------------------------------------------------
*/
TDisplayMode CCameraCaptureEngine::DisplayMode() const
    {
    TInt color;
    TInt gray;
    TDisplayMode displayMode = 
        iEikEnv->WsSession().GetDefModeMaxNumColors( color, gray );
    return displayMode;
    }

/*
-----------------------------------------------------------------------------

	CCamera::TFormat CCameraCaptureEngine::ImageFormat() const

	Description: Returns camera image format to be used with current display 
				 mode
	Comments   :

    Return values: Returns camera image format to be used with current display 
				   mode

-----------------------------------------------------------------------------
*/
CCamera::TFormat CCameraCaptureEngine::ImageFormat() const
    {
    switch ( iDisplayMode )
        {
        case EColor16M:
            return CCamera::EFormatFbsBitmapColor16M;
        case EColor64K:
            return CCamera::EFormatFbsBitmapColor64K;
        case EColor4K:
            return CCamera::EFormatFbsBitmapColor4K;
        default:
            return CCamera::EFormatFbsBitmapColor4K;
        }
    }

/*
-----------------------------------------------------------------------------

	CCamera::TFormat CCameraCaptureEngine::ImageFormatMax() const

	Description: Returns highest color mode supported by HW
	Comments   :

    Return values: Returns highest color mode supported by HW

-----------------------------------------------------------------------------
*/
CCamera::TFormat CCameraCaptureEngine::ImageFormatMax() const
    {
    if ( iInfo.iImageFormatsSupported & CCamera::EFormatFbsBitmapColor16M )
        {
        return CCamera::EFormatFbsBitmapColor16M;
        }
    else if ( iInfo.iImageFormatsSupported & CCamera::EFormatFbsBitmapColor64K )
        {
        return CCamera::EFormatFbsBitmapColor64K;
        }
    else 
        {
        return CCamera::EFormatFbsBitmapColor4K;
        }
    }

/*
-----------------------------------------------------------------------------

	void CCameraCaptureEngine::StopViewFinder() 

	Description: Stops view finding
	Comments   :

    Return values: Stops view finding

-----------------------------------------------------------------------------
*/
void CCameraCaptureEngine::StopViewFinder() 
    {
    if ( iCameraReserved && iCameraReserveComplete )
        {
        iCamera->StopViewFinder();
        }
    }

/*
-----------------------------------------------------------------------------

	void CCameraCaptureEngine::DoViewFinderL() 

	Description: Starts view finding and prepares image capturing
	Comments   :

    Return values: N/A

-----------------------------------------------------------------------------
*/
void CCameraCaptureEngine::DoViewFinderL() 
    {
    //Default, always supported by API
    iCamera->SetExposureL(); 

    if ( iZoomFactor && !iCapturePrepared )
        {
        //Camera released, restore zoom setting
        iCamera->SetDigitalZoomFactorL( iZoomFactor );
        }

    if ( iInfo.iOptionsSupported & TCameraInfo::EViewFinderBitmapsSupported ) 
        {
        //Preferred
        if ( iInfo.iOptionsSupported & TCameraInfo::EImageCaptureSupported && 
            !iCapturePrepared )
            {
            //Request largest image 
            iCamera->PrepareImageCaptureL( iColorDepthHW, 0);
            iCapturePrepared = ETrue;
            }

		// Start the view finding, and transfer the view finder data.
        // Bitmaps are returned by MCameraObserver2::ImageBufferReady(). 
        iCamera->StartViewFinderL( CCamera::EFormatJpeg, iLandscapeSize );
        }
    else if ( iInfo.iOptionsSupported & TCameraInfo::EViewFinderDirectSupported )
        {
        User::Leave(KErrNotSupported);//Not verified
        }
    else
        {
        //Image can be taken without viewfinding
        if ( iInfo.iOptionsSupported & TCameraInfo::EImageCaptureSupported && 
            !iCapturePrepared)
            {
            iCamera->PrepareImageCaptureL( iColorDepthHW, 0);
            iCapturePrepared = ETrue;
            }
        }
    }

/*
-----------------------------------------------------------------------------

	void CCameraCaptureEngine::StartViewFinderL() 

	Description: Reserves camera, switches power on, and starts finally view 
				 finding
	Comments   :

    Return values: N/A

-----------------------------------------------------------------------------
*/
void CCameraCaptureEngine::StartViewFinderL() 
    {    
    ReserveCameraL();
    }  

/*
-----------------------------------------------------------------------------

	void CCameraCaptureEngine::SnapL()

	Description: take a picture
	Comments   :

    Return values: N/A

-----------------------------------------------------------------------------
*/
void CCameraCaptureEngine::SnapL()
    {
    if ( iCameraReserved && iCameraReserveComplete && !iPowering )
        {
        //If the Engine is ready
        iCamera->StopViewFinder();

        // According to on-board camera API, MCameraObserver::ImageReady()
        // will be called back when the following API is called.
        iCamera->CaptureImage();
        }
    else
        {
        User::Leave( KErrNotReady );
        }
    }

/*
-----------------------------------------------------------------------------

	void CCameraCaptureEngine::SetMode( TCameraState aMode )

	Description: Sets engine's camera mode
	Comments   :

    Return values: N/A

-----------------------------------------------------------------------------
*/
void CCameraCaptureEngine::SetMode( TCameraState aMode )
    {   
    iMode = aMode;
    }

/*
-----------------------------------------------------------------------------

	void CCameraCaptureEngine::DeleteEncoder()

	Description: Destructs JPEG encoder
	Comments   :

    Return values: N/A

-----------------------------------------------------------------------------
*/
void CCameraCaptureEngine::DeleteEncoder()
    {
    delete iEncoder;
    iEncoder = NULL;

    delete iBitmapSave;
    iBitmapSave = NULL;
    }

/*
-----------------------------------------------------------------------------

	void CCameraCaptureEngine::SaveImageL(TJpegQualityFactor aQuality, 
							const TFileName* aNewFilePathAndName, RFs* aFs)

	Description: Converts and saves bitmap to JPEG image
	Comments   :

    Return values: N/A

-----------------------------------------------------------------------------
*/
void CCameraCaptureEngine::SaveImageL(TJpegQualityFactor /*aQuality*/, 
    const TFileName* aNewFilePathAndName, RFs* aFs)
    {
    if ( !iEncoder )
        {
        if ( aFs && aNewFilePathAndName )
            {
            iEncoder = CImageEncoder::FileNewL(*aFs, *aNewFilePathAndName, 
                KMimeType);
            }
        else
            {
            User::Leave( KErrArgument );
            }
    }

    // If it is not busy, start to do the conversion.
    if ( !IsActive() )
        {
        iEncoder->Convert( &iStatus, *iBitmapSave );
        iState = EConvertingImage;

        // Update the status pane to "Saving image..."
        iController.ShowConversionStatusL( KSavingImage );
        SetActive();
        }
    }

/*
-----------------------------------------------------------------------------

	void CCameraCaptureEngine::ReserveCameraL()

	Description: Reserves camera
	Comments   : "ResereComplete" will get called after completion

    Return values: N/A

-----------------------------------------------------------------------------
*/
void CCameraCaptureEngine::ReserveCameraL()
    {
    iStart = ETrue;
    if ( iCameraReserved && !iCameraReserveComplete )
        {
        //Ongoing, no need to issue again            
        User::Leave(0);
        }

    if ( !iCameraReserved && iCameraReserveComplete )
        {
        iCameraReserved = ETrue;
        iCameraReserveComplete = EFalse;
        iCamera->Reserve();//Async
        }

    if ( iCameraReserved && iCameraReserveComplete )
        {
        if ( !iPowering )
            {
            iPowering = ETrue;
            iCamera->PowerOn();
            }
        else
            {
            User::Leave(0);
            }
        }
    }

/*
-----------------------------------------------------------------------------

	void CCameraCaptureEngine::ReleaseCamera()

	Description: Releases camera
	Comments   : 

    Return values: N/A

-----------------------------------------------------------------------------
*/
void CCameraCaptureEngine::ReleaseCamera()
    {
    iStart = EFalse;  
    if ( iCameraReserved && iCameraReserveComplete )
        {
        iCamera->Release();
        iCameraReserved = EFalse; 
        }
    
    iCapturePrepared = EFalse;
    }

/*
-----------------------------------------------------------------------------

	void CCameraCaptureEngine::PowerOff()

	Description: Switches off camera power 
	Comments   : 

    Return values: N/A

-----------------------------------------------------------------------------
*/
void CCameraCaptureEngine::PowerOff()
    {
    if ( !iPowering && iCameraReserved )
        {
        iCamera->PowerOff();
        ReleaseCamera();
        }
    }

/*
-----------------------------------------------------------------------------

	void CCameraCaptureEngine::HandleEvent(const TECAMEvent &aEvent)

	Description: From MCameraObserver2
	Comments   : 

    Return values: N/A

-----------------------------------------------------------------------------
*/
void CCameraCaptureEngine::HandleEvent(const TECAMEvent &aEvent)
    {
    // The KUidEcam... -constants are defined in ecam.h
    if(aEvent.iErrorCode == KErrNone)
	    {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -