Graphics(4)(转)

本文详细介绍了在Symbian系统中如何使用MBM(Multi-Bitmapfile)文件来管理和加载Bitmap图像资源,包括MBM文件的类型、创建方法、在程序中的使用以及示例代码。此外,还讲解了Bitmap的显示、遮挡、转换和直接数据访问等高级技巧。
这几天总忙,字体那一部分,翻译了三天,进度实在有点慢.今天大概没啥事情了,暂时决定去杭州了,感觉那面还不错,经理很和蔼,他们的技术也正是我想要的.

在Symbian系统中,首选的使用Bitmap的方法是创建一个MBM(Multi-Bitmap file),在程序运行的时候从MBM中载入.一个MBM可以是一个文件存储器,或者只读镜像(ROM image)类型.文件存储器类型的MBM会被压缩,在程序运行的时候需要解压缩,消耗资源,只读镜像类型的MBM不被压缩,直接调用,节省资源.默认的MBM是文件存储器类型.

MBM可以从Windows的Bitmap中创建,使用bmconv工具进行转换.MBM可以直接被命令行所使用,或在mmp文件中定义.在编译的时候,他会被拷贝到相应的目标文件夹下.示例代码:
以下内容为程序代码:

// MyGame.mmp

START BITMAP MyGame.mbm

HEADER

TARGETPATH ........winscsystemappsMyGame

SOURCEPATH ..MyBitmaps

// color-depth source-bitmap

SOURCE c12 image1.bmp

SOURCE c12 image2.bmp

SOURCE c12 image3.bmp

END

以下内容为程序代码:

mmp在Bitmap的.h文件里给其一个枚举型的ID的数字,这个ID数字产生在系统文件夹下,(epoc32include).Bitmap文件可以使用其ID数字在mbm文件中被存取,每一个ID都以下面的格式构造EMbm, 例如EMbmMygameImage1.如下存取MBM文件示例:
images.blogcn.comude%C2%A0mygame.mbg // generated on compilation

" />include // for CompleteWithAppPath()



CFbsBitmap* CMyGameView::LoadMyBitmapL()

{

// set the name of the multi-bitmap file containing the bitmaps

_LIT(KMBMFileName,"MyGame.mbm"wink.gif;

TFileName mbmFileName(KMBMFileName);

CompleteWithAppPath(mbmFileName);



// load the bitmap from the mbm file

CFbsBitmap* bitmap = new (ELeave) CFbsBitmap();

CleanupStack::PushL(bitmap);

// EMbmMygameImage1 is enumerated value from MyGame.mbg file

User::LeaveIfError(bitmap->Load(mbmFileName, EMbmMygameImage1));

CleanupStack::Pop(); // bitmap



return bitmap;

}

当Bitmap被载入以后,他可以被输出显示,如下示例代码:
void CMyGameView:biggrin.gifraw( const TRect& /*aRect*/ wink.gif const

{

// Get the system graphics context

CWindowGc& gc = SystemGc();



// Draw the bitmap

gc.BitBlt( TPoint(10, 10), iMyShipBitmap);

}

通常在一些情况下会用到遮挡.遮挡其实就是以遮挡的方法,来显示黑色和白色的图片.默认设置黑色部分是显示部分,白色是遮挡部分.有一些方法也可以实现反相遮挡.遮挡和普通的显示图片其实是一样的,也需要载入.遮挡示例代码:
以下内容为程序代码:

void CMyGameView:biggrin.gifraw( const TRect& /*aRect*/ wink.gif const

{

// Get the system graphics context

CWindowGc& gc = SystemGc();



// Draw masked bitmap

gc.BitBltMasked( TPoint(10, 10), iMyShipBitmap, iMyShipRect,

iMyShipMask, EFalse);

}

遮挡对于游戏来说是非常有用的,你可以通过遮挡在背景上显示一些不规则的图形或图像.

在图像显示过程中,有时候要同时显示出几张图像来,这样会是一个很消耗系统资源的事情.这就会导致系统在显示图像的情况下比较缓慢,而且图像也是从不完整或者不准确到准确这样的一个显示过程.虽然最后的显示结果是准确的,但是,我们通常使用另外一种方法来避免这种情况.我们通常来建立一个容器类来控制图片的显示,转化和储存.

图片的转化可以使用一个临时的Bitmap来实现,示例代码如下:
以下内容为程序代码:

CFbsBitmap* CMyGameView::LoadAndConvertBitmapL(

Const TDesC& aFileName, TInt aBitmapId wink.gif

{

// Load the original bitmap

CFbsBitmap* originalBitmap = new ( ELeave wink.gif CFbsBitmap();

CleanupStack::PushL( originalBitmap wink.gif;

User::LeaveIfError( originalBitmap->Load( aFileName, aBitmapId,

EFalse wink.gifwink.gif;



// Create a new bitmap, graphics device and context

CFbsBitmap* newBitmap = new ( ELeave wink.gif CFbsBitmap();

CleanupStack::PushL( newBitmap wink.gif;

newBitmap->Create( originalBitmap->SizeInPixels(),

Window()->DisplayMode() wink.gif;

CFbsBitmapDevice* graphicsDevice = CFbsBitmapDevice::NewL(

bitmapConverted wink.gif;

CleanupStack::PushL( graphicsDevice wink.gif;

CFbsBitGc* graphicsContext;

User::LeaveIfError( graphicsDevice->CreateContext(

graphicsContext wink.gifwink.gif;



// Blit the loaded bitmap to the new bitmap (the actual

// conversion)

bitmapContext->BitBlt( TPoint(0,0), originalBitmap wink.gif;



CleanupStack::Pop(3);

delete bitmapContext;

delete bitmapDevice;

delete originalBitmap;

return newBitmap;

}

上面的例子通过参数来获得文件名和Bitmap的ID,从MBM文件中载入相应的Bitmap.转化Bitmap为windows的显示模式,使用新的Bitmap来显示.

Bitmap可以旋转和块状化,这也是很有用处的.CMdaBitmapRotator来实现旋转一定的角度,CMdaBitmapScaler来实现块状化.S60平台2.0以前的版本不支持这两种方法,他使用了这两种CbitmapRotator
和CbitmapScaler,实现的功能是一样的.

实际上这两种方法的执行是异步的,通过继承自MMdaImageUtilObserver一个类来通知操作完成.如果你觉得对于Bitmap的操作方法太少,你也可以使用或者定义其他新的.If speed is a critical factor, you can access the bitmap data directly with a pointer and modify it as needed.

你可以使用CFbsBitmap:dataAddress来直接存取Bitmap数据区域的头指针(最左上角第一个点).有一点要注意,在程序运行的时候,这个点可能会被移动.所以,在对其使用TBitmapUtil进行存取的时候,要进行锁定.在S60平台2.0里,我们使用CFbsBitmap的LockHeap和UnlockHeap的方法.

在对Bitmap数据直接访问的时候,你需要知道他们的格式,比如,16比特的Bitmap是5-6-5格式,而12比特的Bitmap是4-4-4的格式.下面示例代码演示了给所有象素加上一个红色部分:
以下内容为程序代码:

void CMyGameView:biggrin.gifoMyBitmapEffect(CFbsBitmap* aBitmap)

{

// Lock heap

// For series 60 2.0 use:

// aBitmap->LockHeap();

// For series 60 1.0 use:

TBitmapUtil bitmapUtil(aBitmap);

bitmapUtil.Begin( TPoint(0,0) wink.gif;



// Edit bitmap

TSize bitmapSize = aBitmap->SizeInPixels();

// NOTE: TUint16* applies to 16bit bitmaps only; the pointer must

// correspond the bit depth of the bitmap.

TUint16* bitmapData = (TUint16*)aBitmap->DataAddress();

for ( TInt y = 0; y < bitmapSize.iHeight; y++ wink.gif;

{

for ( TInt x = 0; x < bitmapSize.iWidth; x++ wink.gif

{

// Increase colour value of each pixel by one

*bitmapData = ( *bitmapData & 31 wink.gif | // blue

( ( *bitmapData >> 5 wink.gif & 63 wink.gif | // green

( ( *bitmapData >> 11 wink.gif & 31 + 1 wink.gif; // red

bitmapData++;

}

}

// Unlock heap

// For series 60 1.0 use:

bitmapUtil.End();

// For series 60 2.0 use:

// aBitmap->UnlockHeap();

}

最后,Hardware Acceleration里面给我们提供了很多好东东.

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10294527/viewspace-126362/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10294527/viewspace-126362/

考虑柔性负荷的综合能源系统低碳经济优化调度【考虑碳交易机制】(Matlab代码实现)内容概要:本文围绕“考虑柔性负荷的综合能源系统低碳经济优化调度”展开,重点研究在碳交易机制下如何实现综合能源系统的低碳化与经济性协同优化。通过构建包含风电、光伏、储能、柔性负荷等多种能源形式的系统模型,结合碳交易成本与能源调度成本,提出优化调度策略,以降低碳排放并提升系统运行经济性。文中采用Matlab进行仿真代码实现,验证了所提模型在平衡能源供需、平抑可再生能源波动、引导柔性负荷参与调度等方面的有效性,为低碳能源系统的设计与运行提供了技术支撑。; 适合人群:具备一定电力系统、能源系统背景,熟悉Matlab编程,从事能源优化、低碳调度、综合能源系统等相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①研究碳交易机制对综合能源系统调度决策的影响;②实现柔性负荷在削峰填谷、促进可再生能源消纳中的作用;③掌握基于Matlab的能源系统建模与优化求解方法;④为实际综合能源项目提供低碳经济调度方案参考。; 阅读建议:建议读者结合Matlab代码深入理解模型构建与求解过程,重点关注目标函数设计、约束条件设置及碳交易成本的量化方式,可进一步扩展至多能互补、需求响应等场景进行二次开发与仿真验证。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值