#include <string> #include <vector> #include <fstream> using namespace std; class CBmpFile { public: CBmpFile(){} ~CBmpFile(){} bool load(const string& file) { // 打开文件 ifstream fs(file, ios_base::in | ios_base::beg | ios_base::binary); if (!fs.is_open()){ return false; } // 读取文件标志 fs.read((char*)&m_tag, sizeof(WORD)); if (m_tag != 0x4D42){ return false; } // 读取文件头 fs.read((char*)&m_fileHeader, sizeof(m_fileHeader)); if (fs.gcount() != sizeof(m_fileHeader)){ return false; } // 读取位图信息头 fs.read((char*)&m_infoHeader, sizeof(m_infoHeader)); if (fs.gcount() != sizeof(m_infoHeader)){ return false; } // 调色板数据 m_palette.resize(m_fileHeader.bfOffBits - sizeof(m_tag)-sizeof(m_fileHeader)-sizeof(m_infoHeader)); fs.read(&m_palette[0], m_palette.size()); // 读取位图数据 m_data.resize(m_fileHeader.bfSize - m_fileHeader.bfOffBits); fs.read(&m_data[0], m_data.size()); if (fs.gcount() != m_data.size()){ return false; } fs.close(); return true; } WORD m_tag; BITMAPFILEHEADER m_fileHeader; BITMAPINFOHEADER m_infoHeader; vector<char> m_palette; vector<char> m_data; private: typedef unsigned char BYTE; typedef unsigned short WORD; typedef unsigned long DWORD; typedef long LONG; //位图文件头定义; typedef struct{ DWORD bfSize;//文件大小 WORD bfReserved1;//保留字 WORD bfReserved2;//保留字 DWORD bfOffBits;//从文件头到实际位图数据的偏移字节数 }BITMAPFILEHEADER; typedef struct{ DWORD biSize;//信息头大小 LONG biWidth;//图像宽度 LONG biHeight;//图像高度 WORD biPlanes;//位平面数,必须为1 WORD biBitCount;//每像素位数 DWORD biCompression; //压缩类型 DWORD biSizeImage; //压缩图像大小字节数 LONG biXPelsPerMeter; //水平分辨率 LONG biYPelsPerMeter; //垂直分辨率 DWORD biClrUsed; //位图实际用到的色彩数 DWORD biClrImportant; //本位图中重要的色彩数 }BITMAPINFOHEADER; //位图信息头定义 };
时间: 2024-10-05 04:26:01