显示位图和SVG图

来源:互联网 发布:网络电视运营商 编辑:程序博客网 时间:2024/06/05 23:47

 

 

先打包,在加载 ,最后绘画 

 

打包位图资源 : 

先把图片放到指定文件 夹,然后把大包脚本加入到程序 的mmp文件中(添加在end前的最后)

START BITMAP      graphic_bmp.mbm

HEADER

TARGETPATH        /resource/apps

SOURCEPATH        ../picture/bmp

SOURCE            c24  image1.bmp

SOURCE            c24  image2.bmp

SOURCE            1  image2_mask.bmp

重新编译 后,编译器会把位图图标 打包到graphic_bmp.mbm中,把生成位图资源头文件graphic_bmp.mbg存储到SDK 的头文件目录中

 

打包svg图资源 :

建立一个mk文件,建立后,把svg资源的mk文件加入到bld.inf文件中

加一句:gnumakefile graphic_svg.mk

重新编译后,生成SVG图片资源文件graphic_svg.mif,生成的SVG图片资源头文件graphic_svg.mbg存储在SDK的头文件目录中。

 

图片的加载过程:

如果想在程序中绘制图片,首先需要把图片从多图片资源文件中加载到程序内存 中生成一个位图对象 ,然后就可以在程序中绘制图片了

//加载位图图片 

//声明部分

        CFbsBitmap* iBackgroundImage;

    CFbsBitmap* iImage2;

CFbsBitmap* iImage2mask;

//每个成员变量加载一个位图,在程序中,要绘制的就是这些位图类CFbsBitmap对象

        在头文件中加入

        #include <aknutils.h>

        #include <graphic_bmp.mbg> // Bitmap enumeration

 

//实现部分,加载位图 ConstructL()函数 中

        _LIT(KBitmapPath, "//resource//apps//graphic_bmp.mbm");

 

        TFileName bitmapFile (KBitmapPath);

        User::LeaveIfError (CompleteWithAppPath (bitmapFile));

 

        iBackgroundImage = iEikonEnv->CreateBitmapL( bitmapFile,EMbmGraphic_bmpImage1 );

        iImage2 = iEikonEnv->CreateBitmapL( bitmapFile,EMbmGraphic_bmpImage2 );

        iImage2mask = iEikonEnv->CreateBitmapL( bitmapFile,EMbmGraphic_bmpImage2_mask );

 

EMbmGraphic_bmpImage1是资源ID,在mbg文件中定义 

enum TMbmGraphic_bmp

        {

        EMbmGraphic_bmpImage1,

        EMbmGraphic_bmpImage2,

        EMbmGraphic_bmpImage2_mask

        };

 

在用完后要删除位图对象

//在析构函数中删除

        delete iBackgroundImage;

        delete iImage2;

        delete iImage2mask;

 

//加载SVG图 

//声明部分

    CFbsBitmap* iSoundSvg;  //图片会把SVG图转换成位图,如果要实现矢量拉伸,需要重新加载

CFbsBitmap* iSoundSvgMask;

 

//实现部分

#include <akniconutils.h>  // AknIconUtils类的定义

#include <graphic_svg.mbg> // Bitmap enumeration

        _LIT(KSvgPath, "//resource//apps//graphic_svg.mif");

//加载svg矢量图

        TFileName svgFile (KSvgPath);

        User::LeaveIfError (CompleteWithAppPath (svgFile));

 

        AknIconUtils::CreateIconL(iSoundSvg, iSoundSvgMask, svgFile, EMbmGraphic_svgSound,EMbmGraphic_svgSound_mask);

        //iSoundSvg=AknIconUtils::CreateIconL(svgFile,EMbmGraphic_svgSound);

        AknIconUtils::SetSize(iSoundSvg, TSize(50,50), EAspectRatioNotPreserved);

        AknIconUtils::SetSize(iSoundSvgMask, TSize(50,50), EAspectRatioNotPreserved);

 

//用后同样要删除

        delete iSoundSvg;

        delete iSoundSvgMask;

 

图片的显示过程:

//Draw()函数中实现

        在设备绘图上下文类CWindowGc中绘制图形,CWindowGc是图形上下文CGraphicesContext类的派生类

        //清空窗口上的内容

        gc.SetPenStyle( CGraphicsContext::ENullPen );

        gc.SetBrushColor( KRgbGray );

        gc.SetBrushStyle( CGraphicsContext::ESolidBrush );

        gc.DrawRect( aRect );

        gc.SetBrushStyle( CGraphicsContext::ENullBrush );

 

        //绘制客户区背景

        //gc.BitBlt( Rect().iTl,iBackgroundImage );

        gc.DrawBitmap(aRect,iBackgroundImage);  //通过拉伸的方式放缩要目标矩形中

 

        //在客户区的第一行绘制位图图标

        //绘制非透明位图,选择不含有“Masked”单词的函数就可以了

        TPoint ptPos=aRect.iTl;

        gc.BitBlt(ptPos,iImage2);  //绘制时保持原始大小

 

        //绘制透明位图,需要有相应的掩码图,只有使用两者结合才能显示成功

        TSize size=iImage2->SizeInPixels();

        TRect sourceRect( TPoint( 0,0 ),size); 

        ptPos.iX+=size.iWidth;

        gc.BitBltMasked(ptPos,iImage2,sourceRect,iImage2mask,ETrue);

 

        //绘制放缩的透明位图

        ptPos.iX+=size.iWidth;

        size.iWidth*=2;

        size.iHeight*=2;

        TRect destRect(ptPos,size);

        gc.DrawBitmapMasked(destRect,iImage2,sourceRect,iImage2mask,ETrue);

 

        //在客户区的第2行绘制SVG图图标

        //绘制非透明SVG图

        ptPos=aRect.iTl;

        ptPos.iY+=100;

        gc.BitBlt(ptPos,iSoundSvg);

 

        //绘制透明SVG图

        TSize size2=iSoundSvg->SizeInPixels();

        TRect sourceRect2( TPoint( 0,0 ),size2);

        ptPos.iX+=size2.iWidth;

        gc.BitBltMasked(ptPos,iSoundSvg,sourceRect2,iSoundSvgMask,ETrue);

 

特殊效果绘图: 

//无闪烁重绘

有大量的绘图操作时,程序刷新可能会出现闪烁

Symbian 中,出了提供窗口客户区的绘图上下文设备用于屏幕 绘图外,还提供了一个位图设备。

位图设备实际指向了一个内容中的位图对象,通过位图设备上下文,可以直接把图像绘制到位图上,也就是通过程序代码 直接在内存中绘图,然后把绘制好的位图复制到窗口客户区中。

实现步骤:

1)在Container的头文件中声明

            CFbsBitmap* iOffScreenBitmap;

            CFbsBitmapDevice* iOffScreenBitmapDevice;

            CFbsBitGc* iOffScreenBitmapGc;

 

            CFbsBitmap* iSoundSvg;

2)定义在后台绘画使用的位图、位图设备,位图上下文//ConstructL()

    //加载svg矢量图

        TFileName svgFile (KSvgPath);

        User::LeaveIfError (CompleteWithAppPath (svgFile));

 

        iSoundSvg=AknIconUtils::CreateIconL(svgFile,EMbmGraphic_svgSound);

        AknIconUtils::SetSize(iSoundSvg, TSize(50,50), EAspectRatioNotPreserved);

 

    // 创建离屏位图、位图设备、位图设备上下文

    iOffScreenBitmap = new ( ELeave ) CFbsBitmap();  //创建一个空的位图

    CleanupStack::PushL( iOffScreenBitmap );

    User::LeaveIfError( iOffScreenBitmap->Create( Rect().Size(),EColor4K ) ); //位图的尺寸设置 成与程序客户区的尺寸相同

    CleanupStack::Pop();

    iOffScreenBitmapDevice = CFbsBitmapDevice::NewL(iOffScreenBitmap );  //创建一个位图设备

    iOffScreenBitmapDevice->CreateContext( iOffScreenBitmapGc );                    //创建位图设备的位图设备上下文

3)在析构函数中加入

    delete iOffScreenBitmapGc;

        iOffScreenBitmapGc = NULL;

        delete iOffScreenBitmapDevice;

        iOffScreenBitmapDevice = NULL;

        delete iOffScreenBitmap;

        iOffScreenBitmap = NULL;

4)在位图上绘制图形

//清除位图设备下文中的背景

    iOffScreenBitmapGc->SetPenStyle( CGraphicsContext::ENullPen );

    iOffScreenBitmapGc->SetBrushColor( KRgbGray );

    iOffScreenBitmapGc->SetBrushStyle( CGraphicsContext::ESolidBrush );

    iOffScreenBitmapGc->DrawRect( aRect );

 

    iOffScreenBitmapGc->SetPenStyle(CGraphicsContext::ESolidPen);

    iOffScreenBitmapGc->DrawEllipse(Rect());

 

    iOffScreenBitmapGc->BitBlt(aRect.iTl,iSoundSvg);

 

//负责位图中已经绘制好的图形的到程序窗口客户区中

    CWindowGc& gc = SystemGc();

gc.BitBlt( Rect().iTl,iOffScreenBitmap );