我们知道,Symbian系统中只能直接显示bitmap格式的位图数据,下面的代码演示了如何使用CimageDecoder打开不同格式的图像文件,并把它转换为Symbian的bitmap格式,从而能能够在屏幕上显示出来。
/*****************************************************************************************************************
Image_Reader.cpp
******************************************************************************************************************/
#include <cntfield.h>
#include <cntdef.h>
#include <cntitem.h>
#include <cntfldst.h>
#include <cntdb.h>
#include <COEMAIN.H>
#include <APMREC.H>
#include <APGCLI.H>
CImage_Reader::CImage_Reader(MImageReadyCallBack& aNotify)
:CActive(0),iNotify(aNotify)
{
}
CImage_Reader::~CImage_Reader()
{
Cancel();
delete iFrame;
}
void CImage_Reader::ConstructL(const TDesC& aFileName)
{
CActiveScheduler::Add(this);
iImageName.Copy(aFileName);
TBuf8<255> ImageType;
GetFileType(aFileName, ImageType);
if(ImageType.Length() && iImageName.Length())
{
iImageDecoder = CImageDecoder::FileNewL(CCoeEnv::Static()->FsSession(),aFileName,ImageType);
delete iFrame;
iFrame = NULL;
iFrame = new(ELeave)CFbsBitmap();
iFrame->Create(iImageDecoder->FrameInfo(0).iOverallSizeInPixels,iImageDecoder->FrameInfo(0).iFrameDisplayMode);
iImageDecoder->Convert(&iStatus,*iFrame,0);
SetActive();
}
else
{
TRequestStatus* status=&iStatus;
User::RequestComplete(status, KErrNotSupported);
SetActive();
}
}
void CImage_Reader::GetFileType(const TDesC& aFileName, TDes8& aFileType)
{
TEntry FileEntry;
if(CCoeEnv::Static()->FsSession().Entry(aFileName,FileEntry) == KErrNone)
{
TBuf8<255> FileBuffer;
if(!FileEntry.IsDir())
{
TInt FileSize = FileEntry.iSize;
if(FileSize > 255)
{
FileSize = 255;
}
if(CCoeEnv::Static()->FsSession().ReadFileSection(aFileName,0,FileBuffer,FileSize) == KErrNone)
{
RApaLsSession RSession;
if(RSession.Connect() == KErrNone)
{
TDataRecognitionResult FileDataType;
RSession.RecognizeData(aFileName,FileBuffer,*&FileDataType);
if(FileDataType.iConfidence > aResult.iConfidence)
{
aFileType.Copy(FileDataType.iDataType.Des8());
}
RSession.Close();
}
}
}
}
}
void CImage_Reader::DoCancel()
{
iImageDecoder->Cancel();
}
CFbsBitmap* CImage_Reader::Bitmap()
{
return iFrame;
}
void CImage_Reader::RunL()
{
iNotify.ImageReadyL(iStatus.Int());
}
/*****************************************************************************************************************
Image_Reader.h
******************************************************************************************************************/
#include <e32base.h>
#include <coecntrl.h>
#include <w32std.h>
#include <e32std.h>
#include <cntdef.h>
#include <cntdb.h>
#include <ImageConversion.h>
class CFbsBitmap;
class MImageReadyCallBack
{
public:
virtual void ImageReadyL(const TInt& aError) = 0;
};
class CImage_Reader : public CActive
{
public:
CImage_Reader(MImageReadyCallBack& aNotify);
void ConstructL(const TDesC& aFileName);
~CImage_Reader();
public:
CFbsBitmap* Bitmap();
protected:
void DoCancel();
void RunL();
private:
void GetFileType(const TDesC& aFileName, TDes8& aFileType);
private:
MImageReadyCallBack& iNotify;
CImageDecoder* iImageDecoder;
CFbsBitmap* iFrame;
TFileName iImageName;
};