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

📄 imageconverterengine.cpp

📁 Symbian OS 图片转换程序源代码 可以学习一下
💻 CPP
字号:
/*
* ============================================================================
*  Name     : CImageConverterEngine from ImageConverterEngine.cpp
*  Part of  : ImageConverter
*  Created  : 25.11.2003 by Forum Nokia
*  Implementation notes:
*     Handles all ICL interaction. Implemented as a separate class/engine
*     for the sake of clarity of the example.
*  Version  :
*  Copyright: Nokia Corporation
* ============================================================================
*/

#include "ImageConverterEngine.h"

#include <fbs.h>
#include <ImageConversion.h>
#include <BitmapTransforms.h>

CImageConverterEngine* CImageConverterEngine::NewL( 
	MConverterController* aController )
	{
	CImageConverterEngine* self = 
		new(ELeave) CImageConverterEngine( aController );
	CleanupStack::PushL( self );
	
	self->ConstructL();

	CleanupStack::Pop(); // self
	return self; 
	}

CImageConverterEngine::CImageConverterEngine( 
	MConverterController* aController ) : 
	CActive( EPriorityStandard ), iController( aController )
	{
	}

void CImageConverterEngine::ConstructL()
	{
	User::LeaveIfError( iFs.Connect() );
	iRotator = CBitmapRotator::NewL();
	iScaler = CBitmapScaler::NewL();
	CActiveScheduler::Add( this );
	}

CImageConverterEngine::~CImageConverterEngine()
	{
	delete iImageEncoder; 
	delete iImageDecoder; // CImageDecoder must be deleted before the 
	iFs.Close();          //   related RFs is closed, 
	delete iBitmap;		  //   otherwise a related thread might panic	
	delete iRotator;
	delete iScaler;
	}

void CImageConverterEngine::StartToDecodeL( TFileName& aFileName )
	{
	delete iImageDecoder; iImageDecoder = NULL;
	delete iBitmap; iBitmap = NULL;

	// create the decoder
	iImageDecoder = CImageDecoder::FileNewL( iFs, aFileName );
	
	// create the destination bitmap
	iBitmap = new (ELeave) CFbsBitmap();
	iBitmap->Create( iImageDecoder->FrameInfo().iOverallSizeInPixels,
					 iImageDecoder->FrameInfo().iFrameDisplayMode ); 

	// start conversion to bitmap
	iState = EDecoding;
	iImageDecoder->Convert( &iStatus, *iBitmap );
	SetActive();
	}

void CImageConverterEngine::StartToEncodeL( 
	TFileName& aFileName, TUid aImageType, TUid aImageSubType )
	{
	delete iImageEncoder; iImageEncoder = NULL;

	// create the encoder
	iImageEncoder = CImageEncoder::FileNewL( iFs, aFileName, 
		CImageEncoder::EOptionNone, aImageType, aImageSubType );

	iState = EEncoding;
	iImageEncoder->Convert( &iStatus, *iBitmap );
	SetActive();
	}

void CImageConverterEngine::DoCancel()
	{
	if( iState == EDecoding )
		iImageDecoder->Cancel();
	else if( iState == EEncoding )
		iImageEncoder->Cancel();
	}

void CImageConverterEngine::RunL()
	{
	switch( iState ) 
		{
		case EDecoding:
			{
			if( iStatus == KErrNone ) 
				{
				iState = EIdle;
				iController->NotifyCompletion( KErrNone );
				break;
				}
			else if( iStatus == KErrUnderflow ) 
				{
				iImageDecoder->ContinueConvert( &iStatus );
				SetActive();
				break;
				}
			}
		case EEncoding:
			{
			iState = EIdle;
			iController->NotifyCompletion( iStatus.Int() );
			break;
			}
		case ERotating:
			{
			iState = EIdle;
			iController->NotifyCompletion( iStatus.Int() );
			break;
			}
		case EScaling:
			{
			iState = EIdle;
			iController->NotifyCompletion( iStatus.Int() );
			break;
			}
		default: // some error
			{
			iState = EIdle;
			iController->NotifyCompletion( iStatus.Int() );
			}
		}
	}

void CImageConverterEngine::GetEncoderImageTypesL( 
	RImageTypeDescriptionArray& aImageTypeArray )
	{
	CImageEncoder::GetImageTypesL( aImageTypeArray );
	}

CFrameInfoStrings* CImageConverterEngine::GetImageInfoL()
	{
	// notice that the information is returned from the original image
	//  hence the scaling of the bitmap does not affect the info until
	//  the bitmap is encoded back to image file and opened again
	if( iImageDecoder )
		{
		return( iImageDecoder->FrameInfoStringsL() );
		}
	else
		{
		return( NULL );
		}
	}

void CImageConverterEngine::RotateL( TDirection aDirection )
	{
	if( aDirection == EClockwise90 ) 
		{
		iRotator->Rotate( &iStatus, *iBitmap, 
			CBitmapRotator::ERotation90DegreesClockwise );	
		}
	else 
		{ 
		// 270 clockwise == 90 anticlockwise
		iRotator->Rotate( &iStatus, *iBitmap, 
			CBitmapRotator::ERotation270DegreesClockwise );	
		}

	iState = ERotating;
	SetActive();
	}

void CImageConverterEngine::ScaleL( TInt aPercent )
	{
	TReal32 multiplier; 

	multiplier = aPercent/(TReal32)100.0;

	TInt newWidth = (TInt)(iBitmap->SizeInPixels().iWidth * multiplier);
	TInt newHeight = (TInt)(iBitmap->SizeInPixels().iHeight * multiplier);
		
	// the maintain aspect ratio is by default set to true
	iScaler->Scale( &iStatus, *iBitmap, TSize(newWidth,newHeight) );

	iState = EScaling;
	SetActive();
	}

⌨️ 快捷键说明

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