欢迎来到天天文库
浏览记录
ID:38784753
大小:21.96 KB
页数:8页
时间:2019-06-19
《在VC++中实现设备无关位图类》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、在VC++中实现设备无关位图类CDib 摘要:本文通过CDib类库的实现,介绍在微软VisualC++6.0版集成开发环境下,备无关位图程序的实现机制和编程要点,并给出关键部分的程序代码。关键词:VisualC++应用程序DIBDDBBMP文件一、问题的提出众所周知,Windows可以进行各种各样的图像处理,这归功于它全面的位图支持能力。早在DOS时代就存在着许多的图像文件格式,较著名的如PCX、GIF、JPEG、TGA等,在Windows中,Microsoft又制定了一个BMP格式。Window
2、s把位图(bitmap)分成两大类:“设备相关位图”(DeviceDependentBitmap,简称DDB)与“设备独立位图”(DeviceIndependentBitmap,简称DIB)。严格的说,DIB是一种“格式”,它可以存放在内存中,也可以存储成文件,即常见的BMP文件,不过有时候它的扩展名可能是DIB。大体而言,DIB格式由三部分组成,即:图片信息、调色板信息、像素阵列。“图片信息”中记录着图像文件的大小、色彩数(可分为单色、16色、256色和真彩四种),以及仅有参考价值的“分辨率”等
3、信息。“调色板信息”指的是这张图像所需参考的调色板,虽然“调色板信息”很重要,但是“真彩”的DIB图像却没有调色板。“像素阵列”则是实际存放图像的部分,它是一个很大的数组,对应于屏幕上的像素。VC++的MFC中,以CBitmap类代表DDB图像,极大的方便了编程人员对DDB的使用。然而通常情况下,没有人会把DDB图像存储成文件,因此我们使用更多的是DIB,遗憾的是MFC不象Borland的OWL,有TDib类可以用来处理DIB文件,它对于DIB的支持几乎可以说是没有,因此有必要设计可以重复使用的类
4、CDib,专门用来处理DIB。二、CDib的具体实现在一个涉及DIB操作的应用程序中,常用到的数据结构有BITMAPFILEHEADER、BITMAPINFO、BITMAPINFOHEAD、RGBQUAD。简单的说就是:BMP文件=BITMAPFILEHEADER+BITMAPINFO+位图数据=BITMAPFILEHEADER+BITMAPINFOHEAD+RGBQUAD+位图数据而存在内存中的DIB对象为:DIB对象=BITMAPINFO+位图数据=BITMAPINFOHEAD+RGBQUAD
5、+位图数据1.Dib类的头文件定义在所实现的CDib类中,将完成与DIB操作有关的大部分功能,例如把DDB转换成DIB、从BMP文件建立DIB、建立空白DIB、拷贝调色板、读取BMP文件、存储BMP文件、绘制图像等等。在自定义的类的头文件中所需加入的函数与变量具体如下:classCDib:publicCObject{public:CDib(CBitmap&ddb,CPalette*palette);CDib(char*bmpfile);CDib(CFile&file);CDib(intWidth,
6、intHeight,intBitsPerPixel);~CDib();//取得DIB相关信息//返回像素阵列void*GetBits();//返回每像素的位数intGetBitsPerPixel();//返回图像尺寸BOOLGetDimension(CSize&size);DWORDWidth();DWORDHeight();//调色板大小intGetPaletteCount();//每条扫描线所需的字节数DWORDBytesPerLine();//取得调色板CPalette*GetPalette
7、();//绘图函数//在DC上缩放输出intStretchToDC(CDC&dc,CRect&src,CRect&dst,DWORDrop=SRCCOPY);//在DC上等尺寸输出intSetToDC(CDC&dc,CRect&src,CPoint&dst);//输出到DDBBOOLCopyToDDB(CBitmap&ddb);//文件相关//存文件BOOLDoSaveFile(char*bmpfile);//写入指定文件BOOLDoWriteFile(CFile&file);//读入指定文件BO
8、OLDoReadFile(CFile&file);Protected://计算像素阵列的大小longGetImageBodySize();//计算BITMAPINFOHEADER和RGBQUAD数组的大小intGetBITMAPINFOSize();//初始化文件头的信息voidInitDibInfo(intBitsPerPixel,intw=0,inth=0);//复制调色板voidCopyPalette(CPalette&palette);//文件头BITMAPINFO*Dib
此文档下载收益归作者所有