对于图像处理来说,如何从一幅bmp图像中读取它包含的信息,是十分重要的。对于matlab,只需要一句语句,足以。
im=imread('a.bmp');
而对于c++如何将文件读取到内存,或者将数据保存为bmp黑白图像,则需要研究图像是如何进行存储的。
一般的,黑白图像由文件头,信息头,调色板,最后才是位图矩阵信息组成。
文件头由图像的标识,大小,偏移量等组成,其定义为:
typedef struct tagBITMAPFILEHEADER {
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
} BITMAPFILEHEADER, FAR *LPBITMAPFILEHEADER, *PBITMAPFILEHEADER;
而信息头则由文件的长宽等信息组成,其定义为:
typedef struct tagBITMAPINFOHEADER{
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
} BITMAPINFOHEADER, FAR *LPBITMAPINFOHEADER, *PBITMAPINFOHEADER;
其后为调色板,黑白图像调色板则为:
typedef struct tagRGBQUAD {
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;
} RGBQUAD;
最后才是我们比较关注的二维图像信息,其中,信息的位数一般为8bit,最大值为255。
对于读取BMP黑白图像,程序可以这么写:
bool LoadFromFile(const char* str, unsigned char* & data, int & width, int & height)
{
//以二进制方式打开图像文件
ifstream fin(str,ios::in|ios::_Nocreate|ios::binary);
if(!fin)
return false;
fin.seekg(