在进行本文章的阅读前, 应确保已有BMP文件结构的基础知识。
BMP图像结构基本知识链接:C++:关于BMP图像文件的基础知识
BMP类的建立
在对BMP图像文件进行操作前,应对**BMP文件**的属性及接口进行**封装**
class BMP
{
private:
int lineByte;
unsigned char* bmpBuffer;
RGBQUAD* colorTable;
BITMAPFILEHEADER fhead;
BITMAPINFOHEADER ihead;
public:
//初始化
BMP()
{
lineByte = 0;
bmpBuffer = new unsigned char;
colorTable = new RGBQUAD[256];
}
//记得要写析构函数
~BMP(){
delete[]bmpBuffer, colorTable; }
//两个接口:读写操作
void readBmp(string filename);
void saveBmp(string filename);
};
一、BMP的读操作
- 创建ifstream对象, 并以二进制模式打开;
ifstream ifile(filename, ios::binary);
- 读取并存取 BITMAPFILEHEADER 和 BITMAPINFOHEADER
此处用到了std::istream &std::istream::read(char *_Str, std::streamsize _Count);
1)第一个参数是一个char类型的指针,是用于存储所读的信息;
2)第二个参数是一个streamsize类型,可理解为有符号的整型,是用于判断一次读操作所读取的大小;
//此处用到了强制类型转换
ifile.read((char*)&fhead, sizeof(BITMAPFILEHEADER));
ifile.read((char*)&ihead, sizeof(BITMAPINFOHEADER));
- 由于真彩色图像(24位或更高位图像)无调色板,而在有调色板的图像中,8位图像又更为常见,因此在有调色板的情况中,我们仅考虑8位图像的情况,1位和4位图像的情况只要以此类推。
注:8位图像可以表示256色位图
if