位图 矢量图 计算机图像
GRAP秘萋
淹秘甩经营实默数据薰绘雷的快速显示
未黎黧麓嚣黧警
,?i萋≤器i
。繁曩I!i“
簿曩擘。
f。
牵目
摘要本文利用自绘位图实现大数据量计算绘图的快速显示、保存与打印,尤其对绘制灰度和伪彩色图像的显示、保存和打
印有重要意义。
关键词
自绘位图,大数据量计算绘图,显示,保存,打印,灰度图像,伪彩色图像
int
m』eight://位图高度
一、刖昌
在Vc++编程时,对于绘制矢量图来说,只须在视类的onDraw()函数中编制绘图代码就能够轻松地显示,而不用编写任何打印程序就能利用Vc自带的文档一视结构中的缺省打印功能打印矢量图。这对于大多数绘制不需实时计算而且计算量不大的矢量图来说是没有问题的,但是当我们绘图时,如果所绘的图形需要实时计算,并且计算量很大,图形超过视图区,我们需要拖动滑块移动图像浏览时,问题就会显现出来了。尤其是绘制灰度和伪彩色图像,它们由于需要逐点计算各像素点的灰度值,计算量大,又由于VC自身的绘图机制的原因,拖动视图滑块时,程序又要调用OnD残哪()把图像重新绘制一遍,这不仅显示慢,而且打印机也不支持用setPixelV()函数写点在0nDr洲()函数中绘制的灰度和伪彩色图像的打印。
下面介绍一种在拖动滑块时能够快速显示、保存和打印灰度和伪彩色图像等大数据量计算的方法,它的原理是,从位图中用GetDc()得到设备环境指针,再利用SetPixelV()函数绘制灰度和伪彩色图像,这样灰度和伪彩色图像就被绘制到内存设备环境中,然后把位图粘贴到视图区就可显示位图,或把位图转移到打印机设备环境就可实现位图的打印。
DriVate:
CDCdcScreen://屏幕设备环境CDCdcMem://位图内存设备环境CSizebitmapSize://位图大小
2)为该类添加voidcreateBitm印Ex(csizesize)公有成员函数。函数主要代码为:
bitmaDSIze=引ze:
dcScreen.Attach(::GetDC(NULL))://把桌面的一个设备环境封装到CDC类的一个实例中
dcMem.CreateCom∞t.bIeDC(&dcScreen}://用桌面特征初始化内存设备环境
CreateCompatjbJeBjtmap(&dcScreen,sjze.cx,size.cy):
//创建空位图
dcMem.SeIectObject(this):
3)为该类添加CDC。GetDC()公有成员函数,用来返回内存指针供绘图之用。主要代码:
retum&dcMem;
4)为该类添加voidPrepareBitmap()公有成员函数,用来保存系统调色板到位图调色板,删除和释放设备环境。在绘图后立即调用。主要代码为:
int
nCoIors=(1<<(dcScreen.GetDeviceCaps(BITSPlXEL)冰
dcScreen.GetDeviceCaps(PLANES))):
LOGPALETTE术pLogPaI=(LOGPALETTE术)newBYTE【sizeof(LOGPALETTE)+InColors木sizeof(PALETTEENTRY))l:
pLOgPaJ一>paJVersiOn=Ox300;
二、实现
1.利用MFc完成基本应用程序框架,采用多文档滚动视图结构,程序名任取。程序能够自己读绘制图像时的数据文件,数据部分放在文档中,以便绘图时调用。
2.用MFc向导添加一个从cbitmap类继承的新类cwzd—Bitm印类,头文件名和执行文件名为wzdbtm印.h和
Wzdbtm印.cpp。
pLogPaI一>paINumEntries=nCoIors:
::GetSvstemPaIetteEntries(dcScreen.m-hDC,0.nCoIors,(LPPALETTEENTRY)(pLogPaI一>paIPaIEntry)):mpF)aJette=newCPaJette:
mj)Palette一>CreatePaIette(pLogPa”:delete【lpLogPal:
//删除和释放设备环境
dcMem.DeleteDC():
::ReIeaseDC(NULL,dcScreen.Detach()):mWidth=bitmapSize.cx:m—Hejght=bjtmapSjze.cy:
1)该类添加以下成员变量:
Public:
5)为该类添加HANDLECreateDIB(int
4
pbmData)公有成
CRectm上itRect:
//用来保存位图大小范围
CPaIette¥m-pPaIette://保存位图调色板intm—WIdth://位图宽度
员函数,用来生成DIB位图,返回DIB句柄。主要代码如下:
//create‘Dl
Bheaderfrom
our
BITMAPheader
BlTMAPlNFOHEADERbi:
万方数据