symbian:Gif动画图片显示

本文链接:http://user.qzone.qq.com/463450970/blog/1220702709

 

对于Gif动画图片用CImageDecoder解码显示,网上有些说明资料,这里是我调试过的部分代码,可以播放,算是自己的笔记吧。

头文件中相关变量定义:
TInt iType;
CImageDecoder* iDecoder;
CFbsBitmap*  iBitmap;
CFbsBitmap*  iBitmapMark;//对应的掩码位图
CGifTimer*     iGifTimer;
TTimeIntervalMicroSeconds32 iDisplayTimer;
TFrameInfo     iFrameInfo;
TInt      iCurFrame;
TInt      iFrameCount;
源文件中gif动画播放主要代码:
void CImage::StartGif()
{
Cancel();
delete iDecoder;
iDecoder = NULL;
delete iBitmap;
iBitmap = NULL;
delete iBitmapMark;
iBitmapMark = NULL;
this->iDecoder = CImageDecoder::FileNewL(CEikonEnv::Static()->FsSession(),iFileName,CImageDecoder::EAllowGeneratedMask);

if(iFrameCount == 0)
  iFrameCount = this->iDecoder->FrameCount();//得到gif动画图片帧数

if(iCurFrame == iFrameCount)//到最后一帧后,再播放第一帧,所以置零
  iCurFrame = 0;
iFrameInfo = iDecoder->FrameInfo(iCurFrame);//得到帧信息

iBitmap = new (ELeave) CFbsBitmap();

iBitmap->Create(iFrameInfo.iOverallSizeInPixels,iFrameInfo.iFrameDisplayMode);//注意这里位图创建与掩码位图创建的区别
iBitmapMark = new(ELeave) CFbsBitmap();

iBitmapMark->Create(iFrameInfo.iOverallSizeInPixels,EGray256 );//至于这里的参数,sdk有说明,在下一语句代码中会用到,呵
iDecoder->Convert(&iStatus,*iBitmap,*iBitmapMark,iCurFrame); //看sdk
iState = EDecoding;

SetActive();    
}

void CImage::RunL()
{
  if(iStatus.Int() == KErrNone)
  {
   iState = EDecodOver;  
   this->iObserver.ImageDecodeOver(iStatus.Int());//利用观察器通知绘制图片
   if(iType == EGif)
   {
    iGifTimer->StartL(TTimeIntervalMicroSeconds32(iFrameInfo.iDelay.Int64()));//这里启动定时器,注意延时是从帧信息中得到的,我觉得最好还是不要自己设置间隔,呵
   }
  }
  else
   User::Leave(iStatus.Int());
}

void CImage::GifFrameConverState()//这个是定时的观察器函数,也就是上面runl中延时设定的实现
{
iCurFrame++;//解码下一帧,播放
StartGif();
}
void CGifAppView::Draw( const TRect& /*aRect*/ ) const
    {
    // Get the standard graphics context
    CWindowGc& gc = SystemGc();
    // Gets the control's extent
    TRect drawRect( Rect());
    // Clears the screen
    //gc.Clear( drawRect );//注意这里不要清屏
gc.BitBltMasked(iImage->GetCurFrameTl(),iImage->GetBitmap(),Rect(),
  iImage->GetBitmapMark(),EFalse);
   }
上面是主要的功能代码,应该很清楚了,希望路过的老大不要笑话。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值