Bmp格式与编程读取解析

  1. Bmp格式

DigitalImage图像类设计

  1. 图像加载函数,通过bmp图片路径,加载图像数据,通过类构造函数来实现
DigitalImage::DigitalImage(LPCTSTR lpszPath)
{StrCpy(m_FilePath, lpszPath);CFile RdBmp;if (!RdBmp.Open(m_FilePath, CFile::modeRead | CFile::shareDenyWrite)){return;}// 为位图文件头分配空间,并初始化为0m_lpBmpFileHeader = (LPBITMAPFILEHEADER)new BYTE[sizeof(BITMAPFILEHEADER)];memset(m_lpBmpFileHeader, 0, sizeof(BITMAPFILEHEADER));// 读取位图文件头int nCount = RdBmp.Read((void *)m_lpBmpFileHeader, sizeof(BITMAPFILEHEADER));if (nCount != sizeof(BITMAPFILEHEADER)){return;}if (m_lpBmpFileHeader->bfType == 0x4d42)// 判断此文件是不是位图文件(“0x4d42”代表“BM”){// 是位图文件// 计算除位图文件头的空间大小,分配空间并初始化为0DWORD dwDibSize = RdBmp.GetLength() - sizeof(BITMAPFILEHEADER);m_lpNotBmpFileHenderData = new BYTE[dwDibSize];memset(m_lpNotBmpFileHenderData, 0, dwDibSize);// 读取除位图文件头的所有数据RdBmp.Read(m_lpNotBmpFileHenderData, dwDibSize);// 关闭位图文件RdBmp.Close();// 设置位图信息指针m_lpBmpInfo = (LPBITMAPINFO)m_lpNotBmpFileHenderData;// 设置位图信息头指针m_lpBmpInfoHeader = (LPBITMAPINFOHEADER)m_lpNotBmpFileHenderData;// 设置位图颜色表指针m_lpRgbQuad = (LPRGBQUAD)(m_lpNotBmpFileHenderData + m_lpBmpInfoHeader->biSize);// 如果位图没有设置位图使用的颜色数,设置它if (m_lpBmpInfoHeader->biClrUsed == 0){if (m_lpBmpInfoHeader->biBitCount < 9){UINT dwNumOfColor = (UINT)pow(2, m_lpBmpInfoHeader->biBitCount);m_lpBmpInfoHeader->biClrUsed = dwNumOfColor;}}// 计算颜色表长度DWORD dwRgbQuadLength = 0;if (m_lpBmpInfoHeader->biClrUsed > 256)dwRgbQuadLength = 0;elsedwRgbQuadLength = m_lpBmpInfoHeader->biClrUsed * sizeof(RGBQUAD);// 设置位图数据指针m_lpData = m_lpNotBmpFileHenderData + m_lpBmpInfoHeader->biSize + dwRgbQuadLength;// 判断是否有颜色表if (m_lpRgbQuad == (LPRGBQUAD)m_lpData){m_lpRgbQuad = NULL;    // 将位图颜色表指针置空m_bHasRgbQuad = FALSE; // 无颜色表}else{m_bHasRgbQuad = TRUE;  // 有颜色表//删除旧的调色板对象if (m_hPalette != NULL){DeleteObject(m_hPalette);m_hPalette = NULL;}// 申请缓冲区,初始化为0DWORD dwSize = 2 * sizeof(WORD) + m_lpBmpInfoHeader->biClrUsed * sizeof(PALETTEENTRY);LPLOGPALETTE lpLogPalette = (LPLOGPALETTE) new BYTE[dwSize];memset(lpLogPalette, 0, dwSize);// 生成逻辑调色板lpLogPalette->palVersion = 0x300;lpLogPalette->palNumEntries = m_lpBmpInfoHeader->biClrUsed;LPRGBQUAD lpRgbQuad = (LPRGBQUAD)m_lpRgbQuad;for (int i = 0; i < m_lpBmpInfoHeader->biClrUsed; i++){lpLogPalette->palPalEntry[i].peRed = lpRgbQuad->rgbRed;lpLogPalette->palPalEntry[i].peGreen = lpRgbQuad->rgbGreen;lpLogPalette->palPalEntry[i].peBlue = lpRgbQuad->rgbBlue;lpLogPalette->palPalEntry[i].peFlags = 0;lpRgbQuad++;}// 创建逻辑调色板m_hPalette = CreatePalette(lpLogPalette);// 释放缓冲区delete[] lpLogPalette;// 设置位图大小(因为很多位图文件都不设置此项)if (m_lpBmpInfoHeader->biSizeImage == 0){m_lpBmpInfoHeader->biSizeImage = m_lpBmpInfoHeader->biWidth*m_lpBmpInfoHeader->biHeight;}// 位图有效m_bValid = TRUE;}}else{//非位图m_bValid = FALSE;}
}

 

2.图片的显示,通过两种方式显示,通过StretchDIBits函数;

BOOL DigitalImage::Draw(CDC *pDC, CPoint origin, CSize size)
{// 位图无效,无法绘制,返回错误if (!m_bValid){return FALSE;}// 旧的调色板句柄HPALETTE hOldPalette = NULL;// 如果位图指针为空,则返回FALSEif (m_lpNotBmpFileHenderData == NULL){return FALSE;}// 如果位图有调色板,则选进设备环境中if (m_hPalette != NULL){hOldPalette = SelectPalette(pDC->GetSafeHdc(), m_hPalette, TRUE);}// 设置位图伸缩模式pDC->SetStretchBltMode(COLORONCOLOR);// 将位图在pDC所指向的设备上进行显示StretchDIBits(pDC->GetSafeHdc(), origin.x, origin.y, size.cx, size.cy,0, 0, m_lpBmpInfoHeader->biWidth, m_lpBmpInfoHeader->biHeight, m_lpData, m_lpBmpInfo, DIB_RGB_COLORS, SRCCOPY);// 恢复旧的调色板if (hOldPalette != NULL){SelectPalette(pDC->GetSafeHdc(), hOldPalette, TRUE);}return TRUE;
}

3.通过SetPixel逐像素显示。

BOOL DigitalImage::DrawPixel(CDC * pDC, CPoint origin)
{	for (int i = m_lpBmpInfoHeader->biHeight-1; i>=0; i--){for (int j = 0; j < m_lpBmpInfoHeader->biWidth; j++){int index = i*m_lpBmpInfoHeader->biWidth + j;int indexcolor = m_lpData[index];COLORREF color;color = RGB(m_lpRgbQuad[indexcolor].rgbRed, m_lpRgbQuad[indexcolor].rgbGreen, m_lpRgbQuad[indexcolor].rgbBlue);pDC->SetPixel(i, j, color);}}return TRUE;
}

4.运行结果:

对于逐像素显示的函数,颜色数据解析存在不足,显示如下,对于存在的错误,还需继续专研。

 

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

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

相关文章

关于奈氏准则和香农公式

对于带宽固定的信道&#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;…

机器学习

机器学习 sklearn基础功能&#xff1a; 主要使用python的sklearn库:sklearn库共分为6大部分&#xff0c;分别用于完成分类任务、回归任务、聚类任务、降维任务、模型选择以及数据的预处理。各模块功能介绍 分类任务分类模型加载模块最近邻算法neighbors.NearestNeighbors支持…

费米悖论的三十种解释

© David B. Mattingly来源&#xff1a;利维坦 文&#xff1a;Ella Alderson译&#xff1a;Rachel校对&#xff1a;Yord原文&#xff1a;/medium.com/predict/30-solutions-to-the-fermi-paradox-aaabfce56280利维坦按&#xff1a;我个人现阶段觉得&#xff0c;与其说接受宇…

无监督学习

目标 利用无标签的数据学习数据的分布或数据与数据之间的关系被称作无监督学习。 有监督学习与无监督学习的最大去区别在于数据是否有标签。 无监督学习最常见的应用场景是聚类和降维。 聚类 聚类&#xff0c;就是根据数据的“相似性”将数据分为多类的过程。相似性评估&am…

重磅!三星宣布3nm成功流片!

来源&#xff1a;世界先进制造技术论坛(AMT)编辑&#xff1a;小艾 6月29日&#xff0c;据外媒最新报道&#xff0c;三星宣布&#xff0c;3nm制程技术已经正式流片! 据悉&#xff0c;三星的3nm制程采用的是GAA架构&#xff0c;性能上完胜台积电的3nm FinFET架构!据报导&#xff…

前端实战:仿写小米官网第一天

前端实战的第一天 小米官网 目前效果&#xff1a; 实现功能&#xff1a; 导航栏&#xff0c;首页切换&#xff0c;无淡入淡出效果的轮播图&#xff0c;搜索功能&#xff0c;产品展示栏下滑 代码&#xff08;便于记录&#xff0c;将js、css和html糅合在了一起&#xff09;&…

ubuntuxu双系统安装+git/g++/vim+pytorch+opencv+yolo+sitl相关学习

multirotor The first day ——12.10 1.install vmware-workstation and ubuntu swap sources and 换输入法 2.learn git github关联远程仓库 3.install and use Typora Git codemeaningmkdir test创建目录cd test进入目录git init初始化仓库ls &#xff1b;ls -ah查看目…

MySQL日志详细说明

这片博文我们会详细说明MySQL本身的日志&#xff0c;不包含重做日志和undo日志&#xff08;这两个日志是innodb存储引擎的日志&#xff09;。 MySQL本身的日志有以下几种&#xff08;MySQL5.7版本&#xff09;&#xff1a; 错误日志慢查询日志通用日志二进制日志错误日志 默认情…

python-DBSCAN密度聚类

1.DBSCAN 算法是一种基于密度的聚类算法&#xff1a; 聚类的时候不需要预先指定簇的个数。最终的簇的个数不定。 2.DBSCAN 算法将数据点分为三类&#xff1a; 核心点&#xff1a;在半径Eps内含有超过MinPts数目的点边界点&#xff1a;在半径Eps内点的数量小于MinPts&#xff…

院士报告 | 李德仁:基于数字孪生的智慧城市(PPT)

来源&#xff1a;转自智慧城市大讲堂&#xff0c;微信编辑&#xff1a;邱峰、罗兵&#xff0c;张钦煜微信审核&#xff1a;张祥、吴斌、数字理政研究院、中通协大数据分会本文为首届川渝住房城乡建设博览会——川渝数智城市BIM/CIM高峰论坛上&#xff0c;中国科学院院士、中国工…

Hanlp的安装和配置

Hanlp简介 HanLP 是由一系列模型与算法组成的 Java 工具包&#xff0c;目标是普及自然语言处理在生产环境中的应用。 HanLP 具备功能完善、性能高效、架构清晰、语料时新、可自定义的特点。 HanLP 提供下列功能&#xff1a; 中文分词最短路分词N-最短路分词CRF分词索引分词极…

python-主成分分析-降维-PCA

PCA算法及其应用 主成分分析(PCA) 主城成分分析&#xff08;PCA&#xff09;&#xff1a;常见的降维方法&#xff0c;用于高维数据集的探索与可视化&#xff0c;还可以用作数据压缩和预处理。 PCA 可以把具有相关性的高维变量合成为线性无关的低维变量&#xff0c;成为主成分&…

5个基本概念,从统计学到机器学习

来源&#xff1a;CSDN作者&#xff1a;George Seif本文讲述了数据分析师应当了解的五个统计基本概念&#xff1a;统计特征、概率分布、降维、过采样/欠采样、贝叶斯统计方法。从高的角度来看&#xff0c;统计学是一种利用数学理论来进行数据分析的技术。象柱状图这种基本的可视…