Symbian里面读取png,gif,jpg图片

来源:互联网 发布:易语言逆战辅助源码 编辑:程序博客网 时间:2024/05/07 10:32

一、在/Symbian/6.1/Series60/Series60Ex/bmpmanip这个例子中,讲解了如何读取一个gif图片,然后转换成FbsBitmap的方法。

 

Symbian提供了CMdaImageDescToBitmapUtility和CMdaImageFileToBitmapUtility来专门处理读取GIF,PNG,JPG这样的压缩图片。不过,它们都是基于Symbian主线程下的活动对象,而且整个OpenL,ConvertL两个过程是异步执行的。也就是说,你是不可能在一次函数的执行,就完成整个的装载和转换。

它的做法是利用CallBack回调函数。首先你执行一次OpenL打开,等它活动对象跑了几圈后,打开完毕就马上执行一次MMdaImageUtilObserver::MiuoOpenComplete函数。然后你才可以执行ConvertL进行转换,然后又等活动对象再跑几圈,然后它再执行另一个回调MiuoConvertComplete函数。通过他们的参数,你就能知道是否打开和转换成功。

不过,还是有几点要说明的。

第一就是关于CMdaImageDescToBitmapUtility的。它的OpenL参数是一个Descriptor。但是,请注意了,这个Descriptor在MiuoConvertComplete执行前,就必须保持。所以,你千万不能直接使用TPtrC8(aBuf,aBufSize)这样传送给OpenL,一旦这样执行,它就会在MiuoOpenComplete给你一个(-5)NotSuppoted的错误提示。 同样的情况也适合于CMdaAudioPlayerUtility的NewDesPlayerReadOnlyL。

第二,关于CFbsBitmap直接访问其数据缓冲的办法.如果是1.0的SDK,那么需要使用TBitmapUtil::Begin函数来锁定内存,然后才能操作其缓冲区.操作完成后,需要使用TBitmapUtil:End来释放锁存.如果是2.0的SDK,那么可以直接使用LockHeap和UnlockHeap函数。如果要同时锁存两个或者两个以上得BITMAP的时候,那么第二个以后的TBitmapUtil都应该使用包含TBitmapUtil引用参数的构造函数。否则第二次锁存Begin函数的时候,就会出现死循环。

第三,CFbsBitmap内存中,每行之间的数据并非是连续的。每行的缓冲的字节数,都应该是word(4字节)的倍数。这一点和DX类式,和Bmp文件也类似。如果你的CFbsBitmap是奇数宽度,而颜色是12位色,那么每行象素数据之后,还应该有个一个16位的空白单元。

-------文章引用http://www.sf.org.cn/Article/Graphics/200509/354.html

 

二、如果想在symbian中使用jpg或者png图片,则需要用到symbian提供的那个Multimedia ICL库里的类了。其中比较重的是CImageDecoder类,提供了对图像进行解码的功能。

来看看如何使用它的吧。先定义两个字串:

_LIT(KJPEGFile,"C://Data//me.jpg");
_LIT(KJPEGType,"image/jpeg");

使用的代码比较简单,如下所示:
iDec = CImageDecoder::FileNewL(iRFs,KJPEGFile);
   
iParent->iBkImageMask=new (ELeave) CFbsBitmap();
iParent->iBkImageMask->Create( iDec-> FrameInfo().iOverallSizeInPixels,iDec-> FrameInfo().iFrameDisplayMode );
iDec->Convert( &iStatus, *(iParent->iBkImageMask) );

其中的iDec是CImageDecoder的实例,而iRFs是RFs的实例。而iParent->iBkImageMask则是一个CFbsBitmap对象实例。

也就是说,我们先利用CImageDecorder::FileNewL来打开一个图像文件(它会自已判断图像类型,我们也可以提供给它我们指定的图像类 型)。然后这个图像的信息就保存在iDec->FrameInfo()中了,利用这个信息可以创建一个CFbsBitmap实例(因为 symbian中所有显示的图像都是这种类型)。最后,调用CImageDecorder的异步函数Convert就可以将图像(jpeg 或者png格式的)转换成CFbsBitmap位图了。唯一的麻烦是Convert是一个异步函数,第一个参数是TRequestStatus类型(可以 是一个活动对象的iStatus成员)。

除了CImageDecorder::FileNewL以外还有一个CImageDecorder:;DataNewL也可以用来从一个缓冲区的字节内容构造出图像数据,只是它第二个参数是TDesC8&类型的aSourceData。

[补充]

别忘了包括头文件 ImageConversion.h,还有引入库imageconversion.lib。

-----文章引用http://hi.baidu.com/simbalg/blog/item/77f007541bd4525c574e0087.html

 

三、

1.只能用异步
2.Convert之后是SetActive(); 在RunL()等待结果.

//在添加的Active Object类中加载图片

_LIT(fName, "c://blackFont.png "); //要使用symbian中的路径,而不是Windows的路径。
User::LeaveIfError(iRfs.Connect());
iImageDecoder = CImageDecoder::FileNewL(iRfs, fName);
iBitMap = new(ELeave) CFbsBitmap();
TFrameInfo frameInfo;
frameInfo = iImageDecoder-> FrameInfo();
iBitMap-> Create(frameInfo.iOverallSizeInPixels, frameInfo.iFrameDisplayMode);
iImageDecoder-> Convert(&tStatus, *iBitMap);
SetActive();

//定义RunL()函数处理响应 因为需要调用container中的draw函数,所以定义接口类

m_pController->NotifyCompletion( KErrNone ); //调用语句 CImageConverterEngine* m_pController;

class MConverterController   //接口类
{
public:
   virtual void NotifyCompletion( TInt aErr ) = 0;
};

//container中处理

   if( aErr == KErrNone )
   {
    // we have succesfully decoded an image, now make the view
    // to display it
    m_pImage= m_pConverter->m_pImage; //CImageConverterEngine* m_pConverter;

   }
   DrawNow();

需要注意的是,container类要继承MConverterController,否则无法使接口类调用container中的对应函数。顺便哀悼一下因为该问题而消耗的将尽一天的时光ORZ

----文章来源http://hi.baidu.com/bloodyfox/blog/item/81bc621e1ccac5f71ad57637.html

四、

Symbian OS不仅原生的支持Bitmap位图,还可以使用CImageDecoder类对jpeg/gif/png类型的图像进行编码和解码。

CImageDecoder可以从文件创建,也可以从描述符中创建,具体创建方法请参看SDK。

CImageDecoder要结合活动对象使用,使用的方法很简单:

void CImageHelper::LoadPngImageL(TDesC& aFileName, CFbsBitmap* aBitmap, CFbsBitmap* aBitmapMask)
    {

    if (iImgDecoder)
        {
        iImgDecoder->Cancel();
        delete iImgDecoder;
        iImgDecoder = NULL;
        }

    // 获取图片
    iImgDecoder = CImageDecoder::FileNewL(iFs, aFileName, KMIMEType);
    TSize size = iImgDecoder->FrameInfo().iOverallSizeInPixels;
    TDisplayMode mode = iImgDecoder->FrameInfo().iFrameDisplayMode;

    // 创建位图
    User::LeaveIfError(aBitmap->Create(size, mode));
    User::LeaveIfError(aBitmapMask->Create(size, EGray256));

    // 调用转换异步函数
    iStatus = KRequestPending;
    iImgDecoder->Convert(&iStatus, *aBitmap, *aBitmapMask);

    SetActive();
    iActiveSchedulerWait->Start();
    }

其中,KMIMEType为图像文件的MIME类型,对应jpeg、gif、png分别为image/jpeg、image/gif、image/png。

----文章来源一、在/Symbian/6.1/Series60/Series60Ex/bmpmanip这个例子中,讲解了如何读取一个gif图片,然后转换成FbsBitmap的方法。

Symbian提供了CMdaImageDescToBitmapUtility和CMdaImageFileToBitmapUtility来专门处理读取GIF,PNG,JPG这样的压缩图片。不过,它们都是基于Symbian主线程下的活动对象,而且整个OpenL,ConvertL两个过程是异步执行的。也就是说,你是不可能在一次函数的执行,就完成整个的装载和转换。

它的做法是利用CallBack回调函数。首先你执行一次OpenL打开,等它活动对象跑了几圈后,打开完毕就马上执行一次MMdaImageUtilObserver::MiuoOpenComplete函数。然后你才可以执行ConvertL进行转换,然后又等活动对象再跑几圈,然后它再执行另一个回调MiuoConvertComplete函数。通过他们的参数,你就能知道是否打开和转换成功。

不过,还是有几点要说明的。

第一就是关于CMdaImageDescToBitmapUtility的。它的OpenL参数是一个Descriptor。但是,请注意了,这个Descriptor在MiuoConvertComplete执行前,就必须保持。所以,你千万不能直接使用TPtrC8(aBuf,aBufSize)这样传送给OpenL,一旦这样执行,它就会在MiuoOpenComplete给你一个(-5)NotSuppoted的错误提示。 同样的情况也适合于CMdaAudioPlayerUtility的NewDesPlayerReadOnlyL。

第二,关于CFbsBitmap直接访问其数据缓冲的办法.如果是1.0的SDK,那么需要使用TBitmapUtil::Begin函数来锁定内存,然后才能操作其缓冲区.操作完成后,需要使用TBitmapUtil:End来释放锁存.如果是2.0的SDK,那么可以直接使用LockHeap和UnlockHeap函数。如果要同时锁存两个或者两个以上得BITMAP的时候,那么第二个以后的TBitmapUtil都应该使用包含TBitmapUtil引用参数的构造函数。否则第二次锁存Begin函数的时候,就会出现死循环。

第三,CFbsBitmap内存中,每行之间的数据并非是连续的。每行的缓冲的字节数,都应该是word(4字节)的倍数。这一点和DX类式,和Bmp文件也类似。如果你的CFbsBitmap是奇数宽度,而颜色是12位色,那么每行象素数据之后,还应该有个一个16位的空白单元。

-------文章引用http://www.sf.org.cn/Article/Graphics/200509/354.html

 

二、如果想在symbian中使用jpg或者png图片,则需要用到symbian提供的那个Multimedia ICL库里的类了。其中比较重的是CImageDecoder类,提供了对图像进行解码的功能。

来看看如何使用它的吧。先定义两个字串:

_LIT(KJPEGFile,"C://Data//me.jpg");
_LIT(KJPEGType,"image/jpeg");

使用的代码比较简单,如下所示:
iDec = CImageDecoder::FileNewL(iRFs,KJPEGFile);
   
iParent->iBkImageMask=new (ELeave) CFbsBitmap();
iParent->iBkImageMask->Create( iDec-> FrameInfo().iOverallSizeInPixels,iDec-> FrameInfo().iFrameDisplayMode );
iDec->Convert( &iStatus, *(iParent->iBkImageMask) );

其中的iDec是CImageDecoder的实例,而iRFs是RFs的实例。而iParent->iBkImageMask则是一个CFbsBitmap对象实例。

也就是说,我们先利用CImageDecorder::FileNewL来打开一个图像文件(它会自已判断图像类型,我们也可以提供给它我们指定的图像类 型)。然后这个图像的信息就保存在iDec->FrameInfo()中了,利用这个信息可以创建一个CFbsBitmap实例(因为 symbian中所有显示的图像都是这种类型)。最后,调用CImageDecorder的异步函数Convert就可以将图像(jpeg 或者png格式的)转换成CFbsBitmap位图了。唯一的麻烦是Convert是一个异步函数,第一个参数是TRequestStatus类型(可以 是一个活动对象的iStatus成员)。

除了CImageDecorder::FileNewL以外还有一个CImageDecorder:;DataNewL也可以用来从一个缓冲区的字节内容构造出图像数据,只是它第二个参数是TDesC8&类型的aSourceData。

[补充]

别忘了包括头文件 ImageConversion.h,还有引入库imageconversion.lib。

-----文章引用http://hi.baidu.com/simbalg/blog/item/77f007541bd4525c574e0087.html

 

三、

1.只能用异步
2.Convert之后是SetActive(); 在RunL()等待结果.

//在添加的Active Object类中加载图片

_LIT(fName, "c://blackFont.png "); //要使用symbian中的路径,而不是Windows的路径。
User::LeaveIfError(iRfs.Connect());
iImageDecoder = CImageDecoder::FileNewL(iRfs, fName);
iBitMap = new(ELeave) CFbsBitmap();
TFrameInfo frameInfo;
frameInfo = iImageDecoder-> FrameInfo();
iBitMap-> Create(frameInfo.iOverallSizeInPixels, frameInfo.iFrameDisplayMode);
iImageDecoder-> Convert(&tStatus, *iBitMap);
SetActive();

//定义RunL()函数处理响应 因为需要调用container中的draw函数,所以定义接口类

m_pController->NotifyCompletion( KErrNone ); //调用语句 CImageConverterEngine* m_pController;

class MConverterController   //接口类
{
public:
   virtual void NotifyCompletion( TInt aErr ) = 0;
};

//container中处理

   if( aErr == KErrNone )
   {
    // we have succesfully decoded an image, now make the view
    // to display it
    m_pImage= m_pConverter->m_pImage; //CImageConverterEngine* m_pConverter;

   }
   DrawNow();

需要注意的是,container类要继承MConverterController,否则无法使接口类调用container中的对应函数。顺便哀悼一下因为该问题而消耗的将尽一天的时光ORZ

----文章来源http://hi.baidu.com/bloodyfox/blog/item/81bc621e1ccac5f71ad57637.html

四、

Symbian OS不仅原生的支持Bitmap位图,还可以使用CImageDecoder类对jpeg/gif/png类型的图像进行编码和解码。

CImageDecoder可以从文件创建,也可以从描述符中创建,具体创建方法请参看SDK。

CImageDecoder要结合活动对象使用,使用的方法很简单:

void CImageHelper::LoadPngImageL(TDesC& aFileName, CFbsBitmap* aBitmap, CFbsBitmap* aBitmapMask)
    {

    if (iImgDecoder)
        {
        iImgDecoder->Cancel();
        delete iImgDecoder;
        iImgDecoder = NULL;
        }

    // 获取图片
    iImgDecoder = CImageDecoder::FileNewL(iFs, aFileName, KMIMEType);
    TSize size = iImgDecoder->FrameInfo().iOverallSizeInPixels;
    TDisplayMode mode = iImgDecoder->FrameInfo().iFrameDisplayMode;

    // 创建位图
    User::LeaveIfError(aBitmap->Create(size, mode));
    User::LeaveIfError(aBitmapMask->Create(size, EGray256));

    // 调用转换异步函数
    iStatus = KRequestPending;
    iImgDecoder->Convert(&iStatus, *aBitmap, *aBitmapMask);

    SetActive();
    iActiveSchedulerWait->Start();
    }

其中,KMIMEType为图像文件的MIME类型,对应jpeg、gif、png分别为image/jpeg、image/gif、image/png。