做图像处理时的源文件一般要用无损的图像文件格式,位图(BitMap)是windows系统下可存储无压缩图像的文件格式。要实现位图文件的读取和存储,首先要明白位图文件的的存储数据结构。位图文件由四部分依序组成:BITMAPFILEHEADER,BITMAPINFOHEADER,调色板,Image Data。
1)BITMAPFILEHEADER结构的长度是固定的14个字节,描述文件的有关信息。其数据结构是:
typedef struct tagBITMAPFILEHEADER {
WORD bfType;//must be 0x4D42.
DWORD bfSize;//the size of the whole bitmap file.
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;//the sum bits of BITMAPFILEHEADER,BITMAPINFOHEADER and RGBQUAD;the index byte of the image data.
} BITMAPFILEHEADER, FAR *LPBITMAPFILEHEADER, *PBITMAPFILEHEADER;
2)BITMAPINFOHEADER结构的长度是固定的40个字节,描述图像的有关信息。其数据结构是:3)调色板:现在的计算机大都是32位或是更高,于是图像数据可用真彩色24位表达的,即每个像素均由24bit表示,每8bit表示RGB三色中的一色。但以前的计算机处理能力较差,图像用1位、4位或8位,即BITMAPINFOHEADER中的biBitCount不是24,这时又想表达出RGB色彩就需要调色板,调色板即使将图像数据中使用的一种颜色对应到RGB颜色中,这样图像数据中的像素值就是一个索引值,真正的像素值是这个索引值对应的调色板中的值。调色板是一个数组,数组中每个元素就是一个rgb颜色,对于8位图像,最多可表达256种颜色,调色板的大小就是256。调色板数组中每个元素的数据结构:
- #include <windows.h>
- class BitMap
- {
- public:
- BitMap();
- ~BitMap();
- protected:
- BITMAPFILEHEADER fileHeader;
- BITMAPINFOHEADER infoHeader;
- public:
- int width_p,height_p,bitCount;
- unsigned char *dataBuf;
- LPRGBQUAD colorTable;
- bool Read(char *fileName);
- bool Write(char *_fileName);
- };
#include <windows.h>
class BitMap
{
public:
BitMap();
~BitMap();
protected:
BITMAPFILEHEADER fileHeader;
BITMAPINFOHEADER infoHeader;
public:
int width_p,height_p,bitCount;
unsigned char *dataBuf;
LPRGBQUAD colorTable;
bool Read(char *fileName);
bool Write(char *_fileName);
};
方法(BitMap.cpp):
- void main()
- {
- BitMap* bm=new BitMap();
- bm->Read("nv.BMP");
- bm->Write("nvnew.bmp");
- delete bm;
- }