如何读入位图(五)

简介: 用C++来读入位图就更加简单了: BOOL CDib::OpenImage(CString fileName) {        BITMAPFILEHEADER m_bmfh; BITMAPINFOHEADER m_bmih; BYTE *img;        //如果文件名位空,则...

C++来读入位图就更加简单了:

BOOL CDib::OpenImage(CString fileName)

{

       BITMAPFILEHEADER m_bmfh;

BITMAPINFOHEADER m_bmih;

BYTE *img;

       //如果文件名位空,则给出警告并退出

       if(!fileName)

       {

              AfxMessageBox("文件名不能位空");

              return false;

       }

       //建立CFile类的对象dib

       CFile dib;

       //打开文件

       if(!dib.Open(fileName,CFile::modeRead))

       {

              //打开失败,则给出警告并退出

              AfxMessageBox("打开文件失败");

              return false;

       }

       //读取位图文件头

       if(dib.Read(&m_bmfh,sizeof(BITMAPFILEHEADER))!=sizeof(BITMAPFILEHEADER))

       {

              //读取失败,则给出警告并退出

              AfxMessageBox("读取位图文件头失败");

              return false;

       }

       //读取位图信息头

       if(dib.Read(&m_bmih,sizeof(BITMAPINFOHEADER))!=sizeof(BITMAPINFOHEADER))

       {

              AfxMessageBox(“读取位图信息头失败”);

              return false;

       }

       //跳过调色板

       dib.Seek(m_bmfh.biOffBits,CFile::begin);

       //为像素数据分配空间

       img=new BYTE[m_bmih.biHeight*((m_bmih.biWidth*m_bmih.biBitCount+31)/32*4)];

       //读入像素数据

       dib.Read(img, m_bmih.biHeight*((m_bmih.biWidth*m_bmih.biBitCount+31)/32*4));

       //关闭文件

       dib.Close();

       return true;

}

 

至于显示的话,就是一个StretchDIBits函数而已,不多说了。下面来看看如何用C++来保存位图:

BOOL CDib::SaveImage(CString fileName)

{

       //如果文件名位空,则给出警告并退出

       if(!fileName)

       {

              AfxMessageBox("文件名不能位空");

              return false;

       }

       //创建CFile类的对象dib

       CFile dib;

       //打开要保存的文件

       if(!dib.Open(fileName,CFile::modeCreate | CFile::typeBinary | CFile::modeWrite))

       {

              AfxMessageBox("打开文件失败");

              return false;

       }

       //保存文件头

       dib.Write(&m_bmfh,sizeof(BITMAPFILEHEADER));

       //保存位图信息头

       dib.Write(&m_bmih,sizeof(BITMAPINFOHEADER));

       //如果是8位位图,还需要保存调色板内容

       if(m_bmih->biBitCount==8)

       {

              //如果没有用到所有的颜色

              if(m_bmih ->biClrUsed!=0)

              {

                     dib.Write(m_lpRgbQuad, m_bmih ->biClrUsed*sizeof(RGBQUAD));

              }

              else

              {

                     //用到了所有的256种颜色

                     dib.Write(m_lpRgbQuad,256*sizeof(RGBQUAD));

              }

       }

       //保存像素数据

       dib.Write(m_lpDibData,m_bmih ->biHeight*GetLineBytes());

       //给出保存成功的提示

       AfxMessageBox("保存成功");

       //关闭文件

       dib.Close();

       return true;

}

其中GetLineBytes()函数就是有图像的宽度和位数得到图像每行像素所占的字节数。计算公式如下:lineBytes=(width*bitCount+31)/32*4;为什么要计算图像每行像素所占的字节数?是因为在保存BMP位图的时候,每行所占的字节数必须是4的倍数,如果不是要补齐。这点跟sizeof用在结构体的时候的字节补齐很类似。

相关文章
|
10月前
|
人工智能 搜索推荐 数据挖掘
企业CRM选型指南:销售易、悟空、超兔的全面对比
在数字化转型中,CRM系统成为企业提升销售效率和竞争力的关键工具。本文对比了销售易CRM、悟空CRM与超兔CRM三个品牌: - **销售易CRM**:提供从线索到现金的全流程管理,拥有强大的数据分析、定制化服务及本土化优势,适合大型企业和跨国公司。 - **悟空CRM**:内置智能数据分析、移动办公支持和360度客户视图,灵活性高,适合中大型及快速发展的企业。 - **超兔CRM**:界面简洁直观,高度定制化,集成第三方应用,支持移动办公,主要面向中小企业。 企业应根据自身需求和预算选择合适的CRM系统,以实现最佳的客户关系管理和销售自动化。
|
运维 Cloud Native Devops
云原生架构的崛起与实践云原生架构是一种通过容器化、微服务和DevOps等技术手段,帮助应用系统实现敏捷部署、弹性扩展和高效运维的技术理念。本文将探讨云原生的概念、核心技术以及其在企业中的应用实践,揭示云原生如何成为现代软件开发和运营的主流方式。##
云原生架构是现代IT领域的一场革命,它依托于容器化、微服务和DevOps等核心技术,旨在解决传统架构在应对复杂业务需求时的不足。通过采用云原生方法,企业可以实现敏捷部署、弹性扩展和高效运维,从而大幅提升开发效率和系统可靠性。本文详细阐述了云原生的核心概念、主要技术和实际应用案例,并探讨了企业在实施云原生过程中的挑战与解决方案。无论是正在转型的传统企业,还是寻求创新的互联网企业,云原生都提供了一条实现高效能、高灵活性和高可靠性的技术路径。 ##
722 30
|
消息中间件 监控 数据挖掘
Elasticsearch 使用误区之二——频繁更新文档
【8月更文挑战第15天】在大数据与搜索技术日益成熟的今天,Elasticsearch 作为一款分布式、RESTful 风格的搜索与数据分析引擎,凭借其强大的全文搜索能力和可扩展性,成为了众多企业和开发者的首选。然而,在使用 Elasticsearch 的过程中,一些常见的误区可能会导致性能下降或数据不一致等问题,其中“频繁更新文档”便是一个不容忽视的误区。本文将深入探讨这一误区的根源、影响及解决方案,帮助读者更好地利用 Elasticsearch。2
427 0
|
安全 NoSQL 关系型数据库
CentOS7下搭建并体验HFish开源蜜罐系统
CentOS7下搭建并体验HFish开源蜜罐系统
1300 0
CentOS7下搭建并体验HFish开源蜜罐系统
|
机器学习/深度学习 文字识别 算法
百度飞桨(PaddlePaddle) - PaddleHub OCR 文字识别简单使用
百度飞桨(PaddlePaddle) - PaddleHub OCR 文字识别简单使用
980 0
|
存储 Web App开发 调度
Windows系统新手教程:常见操作命令帮你玩转电脑
Windows系统新手教程:常见操作命令帮你玩转电脑
310 5
|
SQL Java 数据库连接
Spring中JdbcTemplate和JdbcDaoSupport简单使用
Spring中JdbcTemplate和JdbcDaoSupport简单使用
233 0
Spring中JdbcTemplate和JdbcDaoSupport简单使用
|
存储 IDE 开发工具
硬盘驱动程序设计
硬盘驱动程序设计
269 0
Python语言如何使用MindOpt建模并求解混合整数线性规划问题
MindOpt是一款高效的优化算法软件包,求解算法实现了线性规划(LP)、混合整数线性规划(MILP)、二次规划(QP),可以支持命令行、c、c++、java和python调用。接下来我们将发布一系列文章,讲述各个语言如何使用 MindOpt 来求解数学规划问题。
Python语言如何使用MindOpt建模并求解混合整数线性规划问题
|
Go 索引
Golang随笔之《Go专家编程》查漏补缺
Golang随笔之《Go专家编程》查漏补缺
143 5