位图BitMap图像的读取与存储

来源:互联网 发布:手机看片下什么软件 编辑:程序博客网 时间:2024/05/16 20:29
做图像处理时的源文件一般要用无损的图像文件格式,位图(BitMap)是windows系统下可存储无压缩图像的文件格式。要实现位图文件的读取和存储,首先要明白位图文件的的存储数据结构。位图文件由四部分依序组成:BITMAPFILEHEADER,BITMAPINFOHEADER,调色板,Image Data。

1)BITMAPFILEHEADER结构的长度是固定的14个字节,描述文件的有关信息。其数据结构是:

 

2)BITMAPINFOHEADER结构的长度是固定的40个字节,描述图像的有关信息。其数据结构是:
    值得注意的是,其中biSizeImage指的是实际图像数据的大小,以字节为单位。其计算公式是:宽*高。其中宽必须是4的整数倍。如果不是整数倍,则取大于宽的离4的整数倍最近的数值。这个要求可能是因为现在的计算机大都是32位4字节的,计算机每次读取4字节,这样每行的像素可以整数次读取完成。

3)调色板:现在的计算机大都是32位或是更高,于是图像数据可用真彩色24位表达的,即每个像素均由24bit表示,每8bit表示RGB三色中的一色。但以前的计算机处理能力较差,图像用1位、4位或8位,即BITMAPINFOHEADER中的biBitCount不是24,这时又想表达出RGB色彩就需要调色板,调色板即使将图像数据中使用的一种颜色对应到RGB颜色中,这样图像数据中的像素值就是一个索引值,真正的像素值是这个索引值对应的调色板中的值。调色板是一个数组,数组中每个元素就是一个rgb颜色,对于8位图像,最多可表达256种颜色,调色板的大小就是256。调色板数组中每个元素的数据结构:

4)图像数据对于1位图像,1个像素用1bit存储,对于24位图像,1个像素用24bit存储。位图文件的数据是从下而上,从左而右存储的。所以说,读取的时候,最先读到的是图像左下方的像素,最后读取的是图像右上方的图像。

用c++写的位图文件的读取与存储方法:
类结构(BitMap.h):
[cpp] view plaincopyprint?
  1. #include <windows.h>  
  2. class BitMap  
  3. {  
  4. public:  
  5.     BitMap();  
  6.     ~BitMap();  
  7. protected:  
  8.     BITMAPFILEHEADER fileHeader;  
  9.     BITMAPINFOHEADER infoHeader;  
  10. public:  
  11.     int width_p,height_p,bitCount;  
  12.     unsigned char *dataBuf;  
  13.     LPRGBQUAD colorTable;  
  14.     bool Read(char *fileName);  
  15.     bool Write(char *_fileName);     
  16. };  
方法(BitMap.cpp):
程序入口:
[cpp] view plaincopyprint?
  1. void main()  
  2. {  
  3.     BitMap* bm=new BitMap();  
  4.     bm->Read("nv.BMP");  
  5.     bm->Write("nvnew.bmp");  
  6.     delete bm;  
  7. }  
0 0
原创粉丝点击