This page was last modified 11:05, 6 July 2007.
关于Symbian中的位图操作
From Forum Nokia Wiki
Symbian中的位图操作有点和Windows SDK的相似,有Context有Device,下面具体说说:
Bitmap graphics context
由CBitmapContext类提供了一个Graphics context(CGraphicsContext)的位图graphics的实现.它提供了以下特性:
- 清除和拷贝矩形区域;
- 位图的块传输(block transfer);
- 设置pen色彩和灰度;
- 设置shadow mode;
- 将GC的设置reset到缺省值
Window Server Client端的API提供了一个实现:CWindowGc,这主要是用于屏幕绘图的,另一个实现是CFbsBitGc,这主要是用于in-memory位图的绘制,这些都各有用处:)
参见下图
Bitmap graphics device
由CBitmapDevice类提供了一个Graphics device(CGraphicsDevice)的位图graphics实现。
这里Window Server Client端的API提供了一个实现,CWsScreenDevie,用于屏幕绘制。另一个实现是CFbsBitmapDevice,用于绘制一个in-memory位图,还有一个是CFbsScreenDevice,主要是用来(很少用)直接访问屏幕,跳过了window server的中介。
参见下图
位图的操作维系在CFbsBitmap,它可以表示一个被font和bitmap server所管理的位图。 它提供位图的生成,加载和存储。相关的还有一个TBitmapUtil类,这个类提供
给用户很多函数来操作位图的bits(!),呵呵,是不是很实用啊。
位图一般根据其大小被存储在两个不同的堆中,大尺寸位图(这里有个限度值,为4KB)的存储位置和小尺寸位图是不同的,存储大尺寸位图的堆可以自动进行碎片整理以优化其空间:)
每个位图都有寸有两个尺度单位,一个是twip大小,这是所见即所得的真实世界大小尺寸,还有一个是象素尺寸。
如果要要更直接的操作位图,可以使用CFbsBitmap::DataAddress(), 它可以获得位图加载到内存中的地址,以次来操作位图bit,恐怕是最快的方法了,不过很烦,呵呵,注意了,这里如对RGB进行操作,要注意到色彩的差别,一般概念上的是0xXXXXXX,用6位来表示RGB值,这成为24-bit色彩,但3650/7650的是4094色,即12bit色彩(4KColor),因此操作时,我们要在两者之间转换,我们可以使用TRgb::Color4K进行转换,注意了,其参数是TInt值,不要写*Address样式,否则在模拟器上能通过,手机上就会报告Kern-Exec 3错误了,很头疼:)


