画板BMP格式保存和打开总结
刚做完画板的自定义保存和BMP格式保存,我觉得有必要总结一下。先是比较简单的自定义保存。
万物皆对象,对象由属性和方法构成。我们保存其实保存的是属性,保存的是关键的数据。比如画板的保存,画了一条直线,那么就把图形的名称“直线”,图形的颜色,图形的两个坐标,存储起来就可以了。打开时读取数据,再把这条直线画上去就可以了。其他可以有更复杂的图形,对象,但是思路是一致的。
然后,保存是把数据存储起来,这就要自己决定一种存储数据的方式,存储哪些数据,按照什么先后顺序。读取时的顺序必须和存储时一样,不然就会出错。这就是所谓的文件格式。文件的格式不是由文件的扩展名决定的。如果把word文档的扩展名改成.txt,照样可以用word文档打开。所以格式就是这种存储的方式。
接下来讲BMP文件。BMP文件由四部分组成:
1. 位图文件头数据结构,它包含BMP图像文件的类型、显示内容等信息
2. 位图信息数据结构,它包含BMP图像的宽、高、压缩方法,以及定义颜色等信息。
3. 调色板,这个部分是可选的,有些位图需要调色板,有些位图,比如真彩塑图(24位的BMP)就吧不需要调色板。
4. 位图数据,这个部分的内容根据BMP位图使用的位数的不同而不同,在24位位图中直接使用RBG,而其他的小于24位的使用调色板中颜色索引值。
那么接下来就来比较详细地讲一下各个数据结构。
BMP文件头(14字节)
Int bfType; //位图文件的类型,必须为’B’’M’两个字母(0-1字节) Int bfSize; //位图文件的大小,以字节为单位(2-5字节) Int usignedshort bfreserved01; //文图文件保留字,必须为0(6-7字节) Int usignedshort bfreserved02; //文图文件保留字,必须为0(8-9字节)
Int bfOffBits; //文件头的偏移量表示,以字节为单位(10-13字节) |
位图信息头(40字节)
用于说明位图的尺寸等信息
int size; //本结构所占用的字节数(14-17字节) int image_width; //位图的宽度,以像素为单位(18-21字节) int image_height; //位图的高度,以像素为单位(22-25字节) int planes; //目标设备的级别,必须为1(26-27字节) int biBitCount; //每个像素所需的位数,必须是1(双色),(28-29字节)4(16色),8(256色)或24(真彩色)之一 int biCompression //位图的压缩类型,必须是0(不压缩),(30-33字节)4(16色),8(256色)或24(真彩色)之一 int sizeImage;//为位图大小 int biXpelsPerMeter;//水平分辨率 int biYPelsPerMeter;//垂直分辨率 int biClrUsed;//位图实际使用的颜色表中的颜色数 int biClrImportant;//位图显示过程中重要的颜色
|
颜色表
颜色表用于说明图中的颜色,它有若干个表项,每一个表项是一个RBGQUAD类型的结构,定义一种颜色。
class RBGQUAD{ byte rbgBlue;//蓝色的亮度(值范围为0-255) byte rbgGreen;//绿色的亮度(值范围为0-255) byte rbgRed;//红色的亮度(值范围为0-255) byte rbgReserved;//保留,必须为0 }
|
颜色表中RBGQUAD结构的个数有biBitCount来确定。当biBitCount=1,4,8时,分别有2,16,256个表项;当biBitCount=24时,没有颜色表项。
位图信息头和颜色表组成位图信息,BITMAPINFO结构定义如下:
class BITMAPINFO{ BITMAPINFOHEADER bmiHeader;//位图信息表 RGBQUAD bmiColors[1];//颜色表 } |
位图数据
位图数据记录了位图的每一个像素值,记录顺序是在扫描行内是从左到右,在扫描行间是从上到下。位图的一个像素值所占的字节数。
当biBitCount=1时,8个像素占1个字节
当biBitCount=4时,2个像素占1个字节
当biBitCount=8时,1个像素占1个字节
当biBitCount=24时,1个像素占3个字节
Windows规定一个扫描行所占的字节数必须是4的倍数(即以long为单位),不足的以0填充。
BMP文件的保存大概就是那样的了,下面是我做的一个简易画图板,可以实现BMP格式的保存和打开,代码详见附件。