读取BMP格式数据

#pragma once
#include<afx.h>
class DigitalImage 
{
private:
    //指针数据类型,需要动态分配数据大小,并初始化数据
    char m_FileName[100];

    //文件头
    LPBITMAPFILEHEADER m_lpBitmapFileHender;

    //除位图文件头的所有数据
    LPBYTE m_lpNotFileHenderData;

    //文件信息头
    LPBITMAPINFOHEADER m_lpBitmapInfoHender;
    LPBITMAPINFO m_lpBitmapInfo;
    LPRGBQUAD m_lpRgbQuad;
    
    RGBQUAD* RgbArray;
    //图像数据
    LPBYTE m_lpBmpData;

public:
    DigitalImage(char m_FileName[100]);
    ~DigitalImage();

};

#include "DigitalImage.h"
#include<iostream>
#include<math.h>
using namespace std;

DigitalImage::DigitalImage(char m_FileName[100])
{
    CFile RdBmp;
    if (!RdBmp.Open(m_FileName, CFile::modeRead || CFile::shareDenyWrite))
        cout << "图像文件无法打开!" << endl;

    //申请文件头内存空间,用BYTE数组存储,方便解析,并初始化为零;
    m_lpBitmapFileHender = (LPBITMAPFILEHEADER) new BYTE[sizeof(BITMAPFILEHEADER)];
    memset(m_lpBitmapFileHender, 0, sizeof(BITMAPFILEHEADER));

    //读取文件头
    int FileHenderSize=RdBmp.Read(m_lpBitmapFileHender, sizeof(BITMAPFILEHEADER));
    if(FileHenderSize!= sizeof(BITMAPFILEHEADER))
        cout << "图像文件头读取错误!" << endl;

    //判断是否是位图图像
    if (m_lpBitmapFileHender->bfType == 0x4d42)//0x4d42=="BM",与是否是高字节在前还是低字节在前有关
    {
        //读取文件信息头,文件信息头结构本身大小不变,但是结构m_lpBitmapFileHender的成员变量所指示的某些数据的大小不一样,
        //因此,在分配文件文件信息头数据成员的大小是有所不同,即m_lpBitmapFileHender和m_lpBitmapInfoHender结构的大小是一定的,
        //但是其成员变量所指示的大小可能不同,读取后续数据需要计算,这无疑增加了小白的理解困难。

        DWORD FileSize = m_lpBitmapFileHender->bfSize;//指示了位图文件总的字节数;
        cout << "图像文件总字节数:" << FileSize << endl;
        
        //思考:根据文件头信息,此处如何计算文件信息头的大小呢?
        
        DWORD of = m_lpBitmapFileHender->bfOffBits;//指示了位图数据相对于文件头的偏移量
        //答案:我们知道,文件头包含bfOffBits成员,也知道了bmp文件的大小,则可以计算到位图数据的位置

    
        //思考:此处能直接读取文件信息头吗?


        //读取出文件头之后的所有数据,如何指定所读的大小?
        DWORD NotFileHenderSize = RdBmp.GetLength() - sizeof(BITMAPFILEHEADER);//GetLength()获取文件按字节计算的长度,而不是数量;
        
        //指定除文件头后数据的总大小,并分配,初始化
        m_lpNotFileHenderData = new BYTE[NotFileHenderSize];
        memset(m_lpNotFileHenderData, 0, NotFileHenderSize);

        RdBmp.Close();

        //此处难道是根据NotFileHenderSize这个中的数据来创建文件信息头,颜色表,位图像素数据的?

        //这两个有什么有吗,文件新消息头和颜色表组成了文件信息,下面这个知道其中一个不就行了吗?
        m_lpBitmapInfoHender =(LPBITMAPINFOHEADER) m_lpNotFileHenderData;//除文件头后的数据的开始处确实就是文件信息头的起始地址。
        m_lpBitmapInfo = (LPBITMAPINFO)m_lpNotFileHenderData; //除文件头后的数据的开始处确实就是文件信息头的起始地址。


        //m_lpBitmapInfoHender,m_lpBitmapInfo指针分配完了,如何初始化他们的成员变量呢?

        //先获取到颜色表的指针吧,跟着一步一步来,看吧........,怎么计算起始位置呢?

        
        m_lpRgbQuad = (LPRGBQUAD)(m_lpNotFileHenderData + m_lpBitmapInfoHender->biSize);


        //有些图片有颜色表,有些没有,是怎么区分的呢?有的话,如何创建颜色表呢?

        if (m_lpBitmapInfoHender->biClrUsed == 0)//图像实际使用的颜色数,为零就代表没有颜色了吗
            cout << "图像没有颜色表" << endl;
        else
        {
            //有颜色表的话,如何计算颜色表的长度呢?
            int size = (int)pow(2, m_lpBitmapInfoHender->biBitCount);//biBitCount 注意,
            RgbArray = new RGBQUAD[size];
            //如何初始化颜色数组?不是读取的吗?
            for (int i = 0; i < size; i++)
            {
                RgbArray[i].rgbRed = m_lpRgbQuad->rgbRed;
                RgbArray[i].rgbGreen = m_lpRgbQuad->rgbGreen;
                RgbArray[i].rgbBlue = m_lpRgbQuad->rgbBlue;
                RgbArray[i].rgbReserved = 0;//原来这个数据没有存储图像文件中,直接读的话会导致数据会乱吗?
                m_lpRgbQuad++;
            }

            //还需要计算颜色表的字节长度啊,用于定位像素位置,难道不是颜色数吗?no......
            DWORD RgbLen = size * sizeof(RGBQUAD);//我还以为是这样,size*4

            //像素数据指针,怎么计算
            m_lpBmpData = m_lpNotFileHenderData + m_lpBitmapInfoHender->biSize + sizeof(RgbArray);
            //m_lpBmpData = m_lpNotFileHenderData + sizeof(m_lpBitmapInfo);//可以这样吗
            //m_lpBmpData = m_lpNotFileHenderData + sizeof(BITMAPINFO);//这样可以吗?什么时候能这样?

        }
    }
    else
    {
        cout << "图像文件非BMP格式 !" << endl;
    }
}


DigitalImage::~DigitalImage()
{

    //文件头
    delete[] m_lpBitmapFileHender;

    //除位图文件头的所有数据
    delete[] m_lpNotFileHenderData;

    //文件信息头
     m_lpBitmapInfoHender=NULL;
     m_lpBitmapInfo=NULL;
     m_lpRgbQuad=NULL;

    delete[] RgbArray;
    //图像数据
}
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/484432.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

指甲盖大小塞了500亿晶体管!领先台积电,IBM打造世界首款2纳米芯片!能耗仅为7纳米的1/4!...

文章来源&#xff1a;EETOP我们知道在2014年IBM已将其Microelectronics部门出售给GlobalFoundries时&#xff0c;IBM就已经宣告退出芯片代工业务。但这几年来&#xff0c;尽管IBM退出了代工业务&#xff0c;不过好像IBM在半导体先进工艺研发上一直没有放弃&#xff0c;时不时会…

读取bmp格式数据--实践思考

实践代码 头文件 #pragma once #include <afx.h> class DigitalImage { private://指针数据类型&#xff0c;需要动态分配数据大小&#xff0c;并初始化数据//文件头LPBITMAPFILEHEADER m_lpBitmapFileHender;//除位图文件头的所有数据LPBYTE m_lpNotFileHenderData;//…

人工智能浪潮褪去,冲刺IPO成AI企业生存关键?

来源&#xff1a; 大作此前&#xff0c;AI四小龙持续亏损、登科受阻&#xff0c;投影出“AI估值泡沫&#xff0c;风口浪潮已褪”的现实。反观AI四小龙同期的独角兽格灵深瞳&#xff0c;6月22日科创板IPO受理&#xff0c;拟募资10亿元用于AI算法平台升级、创新应用研发等项目。前…

【开源】iTest教学辅助系统源代码

iTest教学辅助系统 2020.10.16第一次更新 重置了下载链接 2020.12.21第二次更新 重置了下载链接 2021.05.07第三次更新 重置了下载链接 1.关于iTest教学辅助系统 i实验辅助教学平台是基于局域网开发&#xff0c;力求为教师和学生用户提供实验课堂辅助教学环境的计算机系统&…

KnockoutJS-与服务端交互

几乎所有Web应用程序都要和服务器端交换数据&#xff0c;交换数据时最方便的就是使用JSON格式。Knockout可以实现很复杂的客户端交互&#xff0c;对于前后端交互使用的技术最为基本且常用的是Ajax&#xff0c;本次利用Ajax和ko的双向绑定完成一些简单的功能&#xff0c;可以快速…

神经网络无法区分异同,而且这个缺陷是本质性的

来源&#xff1a;混沌巡洋舰1969年《芝麻街》的第一集中有一个片段叫做“这些东西中的一个与众不同”。观众们被要求考虑一张展示三个2和一个 w 的海报&#xff0c;然后一边跟着游戏的同名广告歌唱&#xff0c;一边决定哪个符号不属于这个标志。《芝麻街》中的很多集重复了这个…

matlab计算级数和

级数(series)是指将数列的项依次用加号连接起来的函数。典型的级数有正项级数、交错级数、幂级数、傅里叶级数等。 —百度百科 matlab提供了直接计算级数的两个方法&#xff0c;symsum的两种形式&#xff08;做题刚开始以为是重载&#xff0c;直接导致了上一篇帖子的产生 &…

北国风光

转载于:https://www.cnblogs.com/ssyfj/p/10214328.html

“期待已久的UFO报告”公布了

来源&#xff1a;环球网 作者&#xff1a;张晓雅多家美媒表示&#xff0c;调查没有得出确切结论。包括美国有线电视新闻网&#xff08;CNN&#xff09;、美联社、美国哥伦比亚广播公司&#xff08;CBS&#xff09;在内多家美媒最新消息&#xff0c;美国政府当地时间25日发布报告…

Bmp格式与编程读取解析

Bmp格式 DigitalImage图像类设计 图像加载函数,通过bmp图片路径&#xff0c;加载图像数据&#xff0c;通过类构造函数来实现。 DigitalImage::DigitalImage(LPCTSTR lpszPath) {StrCpy(m_FilePath, lpszPath);CFile RdBmp;if (!RdBmp.Open(m_FilePath, CFile::modeRead | CFil…

关于奈氏准则和香农公式

对于带宽固定的信道&#xff0c;提高信息传输速率有两种方式&#xff1a; 提高码元在信道中的传输速率&#xff1b;提高信噪比&#xff1b; 我们以高速公路的例子来理解&#xff1a; 码元相当于车辆&#xff0c;信道相当于公路&#xff0c;所有的汽车都在运输相同的货物&…

五角大楼公布UFO报告,不明飞行物到底是什么?(全文)

来源&#xff1a;大数据实验室五角大楼周五发布的一份有关不明飞行物的重要报告称&#xff0c;国防和情报分析人员缺乏足够的数据来确定军事飞行员观察到的神秘飞行物体的性质&#xff0c;包括它们是先进的地球技术、大气层还是外星天体。这份报告提交国会并向公众公布&#xf…

python 词云小demo

词云小demo jiebawordcloud一 什么是词云&#xff1f; 由词汇组成类似云的彩色图形。“词云”就是对网络文本中出现频率较高的“关键词”予以视觉上的突出&#xff0c;形成“关键词云层”或“关键词渲染”&#xff0c;从而过滤掉大量的文本信息&#xff0c;使浏览网页者只要一眼…

python--类与GUI编程框架

类属性 类的数据属性&#xff08;静态成员&#xff09;&#xff1a;仅仅是定义的类变量在类创建后被使用可以由类的方法来更新&#xff0c;也可以在主程序中更新类属性和实例无关&#xff0c;修改类属性需要使用类名 class Dog(object):counter0def __init__(self,name):self.…

信道复用技术之码分复用

2020730第一次修改&#xff1a;提升了图片的清晰度 1. 首先来说说什么是信道复用 信道复用&#xff0c;顾名思义&#xff0c;就是把多个用户使用的信道合并在一条信道&#xff0c;即一条信道承载着多个用户传输数据的任务&#xff1b; ps&#xff1a;信道&#xff1a;数据信息传…

《新一代城市大脑建设与发展》专家研讨会在京举办

2021年6月26日&#xff0c;新一代城市大脑建设与发展专家研讨会在京举办&#xff0c;本次活动由城市大脑全球标准研究组主办&#xff0c;远望智库承办。20多位专家参与本次研讨会&#xff0c;对城市大脑、智慧城市的发展趋势&#xff0c;存在的问题&#xff0c;产生的新成果等方…

【基于Python+Flask项目部署系列--03】开发测试环境配置-基于Ubuntu16.04

一、开发测试环境介绍 前提已经部署完【基于PythonFlask项目部署系列--02】Ubuntu16.04服务器安装。建议部署2套环境&#xff1a;开发测试环境生产环境。 这篇文章主要讲解测试环境如何配置python flask项目与运行。 测试环境主要使用【虚拟环境】进行部署代码部署&#xff0c;…