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;
    };
  • 相关阅读:
    像素图生成向量图的算法
    黑白图着色(转换成彩色图片)的算法
    JavaScript的DOM编程--12--innerHTML属性
    JavaScript的DOM编程--11--插入节点
    JavaScript的DOM编程--10--删除节点
    JavaScript的DOM编程--09--节点的替换
    js中return、return true、return false的区别
    JavaScript的DOM编程--08--复习
    JavaScript的DOM编程--07--节点的属性
    JavaScript的DOM编程--06--两个实验
  • 原文地址:https://www.cnblogs.com/zhuyingchun/p/5952457.html
Copyright © 2011-2022 走看看