zoukankan      html  css  js  c++  java
  • 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;
    };
  • 相关阅读:
    SQL Server, Timeout expired.all pooled connections were in use and max pool size was reached
    javascript 事件调用顺序
    Best Practices for Speeding Up Your Web Site
    C语言程序设计 使用VC6绿色版
    破解SQL Prompt 3.9的几步操作
    Master page Path (MasterPage 路径)
    几个小型数据库的比较
    CSS+DIV 完美实现垂直居中的方法
    由Response.Redirect引发的"Thread was being aborted. "异常的处理方法
    Adsutil.vbs 在脚本攻击中的妙用
  • 原文地址:https://www.cnblogs.com/zhuyingchun/p/5952457.html
Copyright © 2011-2022 走看看