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; //位图信息头定义
};
时间: 2024-10-05 04:26:01

C++读取BMP文件的相关文章

[DEBUG]Opengl读取BMP文件不完整(黑块)解决方法

void* pixeldata,*data;FILE* f;f = fopen("tex.bmp","rb"); //注意使用二进制打开方式!!!fseek(f,0,SEEK_END);size_t fileSize=ftell(f);fseek(f,0,SEEK_SET);data = new BYTE[fileSize];fread(data,fileSize,1,f);pixeldata = (BYTE*)data +54; 在读取一个磁盘文件时,文本方式读取

图解Winhex解析BMP文件数据实例

一 实例解析 示例图片的属性: 原图: 红线处是文件头结束: 第二个红线处是位图信息头结束: 用windows画图取第(2,2)像素点的颜色:画图是从0开始计数,即第3行3列的像素: 搜索16进制的BC542F: 搜到11个: 搜到的数据都靠后:看样子位图数据是倒过来存放的: 对照上面图: 文件头 十六进制值 描 述 42 4D:BM的ASCII值,在Windows中的BMP文件标识符 76 F4 02 00 76 F4 02h=7795714,是文件的大小 - 错误,应该倒过来看: 02 f4

c++创建BMP文件并写入数据

参考:http://zhidao.baidu.com/link?url=K0X3GJIiAdhEJ3UheJ8RTcEKrApKn2B6dRkcEpkVspNfebrm345Ltx7_VUJqDs9QYA-0MOTBMBLcOm-h_MD7sa 参考:http://blog.csdn.net/lanbing510/article/details/8176231 最近要看看自己生成的图像,想输出到一个bmp文件. 1.BMP文件概述 BMP(Bitmap-File)图形文件,又叫位图文件,是Win

Selenium+Python参数化:读取TXT文件

概述 从Selenium模块化一文中,可以看出参数化的必要性,本文来介绍下读取外部txt文件的方法. 如何打开文件 打开文件有以下两个函数可以应用: 1.open(file_name,access_mode) file_name: 文件路径及名称: access_mode :访问方式,具体参数如下,,未提供参数,则默认为r: r:表示读取: w:表示写入: a:表示添加: +: 表示读写: b:表示2进制访问; 2.file函数 file()内建函数它的功能等于open(),如下根据文档说明可知

.NET读取Office文件内容(word、excel、ppt)

引用命名空间 1 using Microsoft.Office.Core; 2 using Word = Microsoft.Office.Interop.Word; 3 using Excel = Microsoft.Office.Interop.Excel; 4 using PowerPoint = Microsoft.Office.Interop.PowerPoint; Word文件的读取 1 public string ReadFile() 2 { 3 string text = str

五种方式让你在java中读取properties文件内容不再是难题

一.背景 最近,在项目开发的过程中,遇到需要在properties文件中定义一些自定义的变量,以供java程序动态的读取,修改变量,不再需要修改代码的问题.就借此机会把Spring+SpringMVC+Mybatis整合开发的项目中通过java程序读取properties文件内容的方式进行了梳理和分析,先和大家共享. 二.项目环境介绍 Spring 4.2.6.RELEASE SpringMvc 4.2.6.RELEASE Mybatis 3.2.8 Maven 3.3.9 Jdk 1.7 Id

python读取mat文件

一.mat文件 mat数据格式是Matlab的数据存储的标准格式.在Matlab中主要使用load()函数导入一个mat文件,使用save()函数保存一个mat文件.对于文件 load('data.mat') save('data_1.mat','A') 其中,'A'表示要保存的内容. 二.python中读取mat文件 在python中可以使用scipy.io中的函数loadmat()读取mat文件,函数savemat保存文件. 1.读取文件 如上例: #coding:UTF-8 import

java无依赖读取Excel文件

说到Java读取Excel文件,用得多的当然是POI或jxls,但今天在看一本书的时候.当中提到使用JdbcOdbcDriver这个驱动类在不依赖第三方库的情况下也能够完毕对Excel文件的读取操作,网上搜了一下原因然后自己写了个样例跑通了,在此记录一下. Java读取数据库大家都非常熟悉,须要一个数据源与对应的驱动.开发人员通过JDBC操作驱动.驱动再去操作数据库.那么Java读取Excel文件也是类似的.在Windows系统中,能够将一个Excel文件注冊为一个ODBC数据源,注冊过程为:

Javascript写入txt和读取txt文件的方法

文章主要介绍了Javascript写入txt和读取txt文件的方法,需要的朋友可以参考下1. 写入 FileSystemObject可以将文件翻译成文件流. 第一步: 例: 复制代码 代码如下: Var fso=new ActiveXObject(Scripting.FileSystemObject); 创建一个可以将文件翻译成文件流的对象. 第二步:用于创建一个textStream 对象 括号里边有三个属性 1. 文件的绝对路径 2. 文件的常数 只读=1,只写=2 ,追加=8 等权限.(Fo