C++读取BMP文件

#include <string>
#include <vector>
#include <fstream>

using namespace std;

class CBitmap
{
public:
    typedef unsigned char BYTE;
    typedef unsigned short WORD;
    typedef unsigned long DWORD;
    typedef long LONG;

    typedef struct{
        DWORD bfSize;        // file size
        WORD bfReserved1;
        WORD bfReserved2;
        DWORD bfOffBits;    // offset from file header to pixel data
    }BITMAPFILEHEADER;

    typedef struct{
        DWORD biSize;        // structure size
        LONG biWidth;
        LONG biHeight;
        WORD biPlanes;        // must be 1
        WORD biBitCount;    // bit number of one pixel
        DWORD biCompression;
        DWORD biSizeImage;
        LONG  biXPelsPerMeter;
        LONG  biYPelsPerMeter;
        DWORD biClrUsed;
        DWORD biClrImportant;
    }BITMAPINFOHEADER;

    CBitmap(){}
    ~CBitmap(){}

    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((char*)&m_palette[0], m_palette.size());

        m_data.resize(m_fileHeader.bfSize - m_fileHeader.bfOffBits);
        fs.read((char*)&m_data[0], m_data.size());
        if (fs.gcount() != m_data.size()){
            return false;
        }

        fs.close();
        return true;
    }

    bool save(const string& file)
    {
        ofstream fs(file, ios_base::binary);
        if (!fs.is_open()){
            return false;
        }

        fs.write((char*)&m_tag, sizeof(WORD));
        fs.write((char*)&m_fileHeader, sizeof(m_fileHeader));
        fs.write((char*)&m_infoHeader, sizeof(m_infoHeader));
        fs.write((char*)&m_palette[0], m_palette.size());
        fs.write((char*)&m_data[0], m_data.size());

        fs.close();
        return true;
    }

    WORD m_tag;
    BITMAPFILEHEADER m_fileHeader;
    BITMAPINFOHEADER m_infoHeader;
    vector<BYTE> m_palette;
    vector<BYTE> m_data;
};

原文链接: https://www.cnblogs.com/zhuyingchun/p/5952457.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/242348

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月13日 下午10:18
下一篇 2023年2月13日 下午10:19

相关推荐