Subject: 绘图知识(一):DataAddress()用法
Lee
Administrator
Rank: 9Rank: 9Rank: 9



UID 2
Digest Posts 0
Credits 18567
Posts 133
Money 189
Reading Access 200
Registered 13-3-2007
Status Offline
Post at 15-3-2007 14:07  Profile | Blog | P.M. 
绘图知识(一):DataAddress()用法

位图由CFbsBitmap类管理,这个类提供了用于创建位图和载入位图的方法,并定义了这些位图的色深和大小。这个类用RFbsSession类来访问FBS,由此隐藏了来自用户的会话类。CFbsBitmap还提供了直接访问位图的图像数据的一些方法。用DataAddress方法可以获取指向该数据地址的指针,而用GetScanLine方法则可以访问具体的扫描行。

    在FBS中,位图根据其大小被划分到两种堆中。大于4KB的位图和小于4KB的位图被存放到不同的堆栈中。这样的划分是为了防止产生文件碎片。当频繁创建并删除一些大位图时,用于大位图的栈就会自动进行碎片整理。由于碎片整理的需要,当正使用大位图文件的内容时,需要锁定这些堆。为了防止碎片整理和位图操作同时发生,TBitmapUtil类提供了对堆进行锁定和解锁的操作。只有直接编辑位图的图像数据时才需要对堆进行锁定操作,而绘图方法和复制方法都自动地提供了锁定功能。在下述范例中,如果是一个大位图的话就锁定FSB堆,并且向位图数据中填写从零开始的各种颜色。该范例假定这个位图针对每个像素使用16位数据,这对12位位图和16位位图都是有效的。

//当大位图时所定堆
if ( bitmap->IsLargeBitmap() )
{
TBitmapUtil bitmapUtil( bitmap );
bitmapUtil.Begin( TPoint(0,0) );
}
// 编辑位图
TSize bitmapSize = bitmap->SizeInPixels();
TUint16* bitmapData = (TUint16*)bitmap->DataAddress();
TUint16 colour = 0;
for ( TInt y = 0; y < bitmapSize.iHeight; y++ );
{
for ( TInt x = 0; x < bitmapSize.iWidth; x++ )
{
*bitmapData++ = colour++;
}
}
// 释放堆
if ( bitmap->IsLargeBitmap() )
{
BitmapUtil.End();
}

为了使位图绘制的速度比使用CFbsBitmaps时的速度更快,窗口服务器提供了自己的位图类CWsBitmap。它通过掌控位图处理的所有权剔除了在窗口服务器和FBS之间所进行的多余的场景切换。CWsBitmap类从CFbsBitmap类继承而来,并且实现所有相同的方法。当对绘图速度有要求时,应使用CWsBitmap类而不是其基类。




有其他问题请加入Symbian开发群参与讨论:群 ①:623041已满,群②:36865776已满 请加群③:76404484
Top
 


All times are GMT+8, the time now is 9-9-2010 20:20

CopyRight © Symbianx.cn 2007 Powered By Discuz! 5
Clear Cookies - Contact Us - Symbian OS系统[S60,UIQ]开发中文翻译论坛 - Archiver

本站原文版权归原文作者所有,本站译文版权归本站所有,如需转载请注明原文和译文出处,否则追究法律责任
debt relief programs
Epson printers and cartridges
Get the best Poker Bonus