首页 > 代码库 > C++读取BMP文件

C++读取BMP文件

#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; //位图信息头定义   
};

 

C++读取BMP文件