随笔 - 49  文章 - 0  评论 - 6  阅读 - 10万

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;
};
复制代码

 

posted on   朱迎春  阅读(607)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示