画板BMP格式保存和打开总结
画板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格式的保存和打开,代码详见附件。