计算机图像显示原理与BMP图像文件格式

2023-10-26

本篇文章详细讲述图像文件,里面有一些阐述为个人理解,如有不对的地方欢迎指正,后续会修正补全。


一、计算机图像显示原理简述

1.计算机图像分类:

关于计算机图像,可以分为两类:位图(Bitmap)和矢量图(Metafile)。

位图由许多的矩形块组成,每个矩形代表一个点,点的个数等于位图的横向矩形块的个数乘上纵向矩形块的个数,每一个点则被称为像素点,而且每个像素点都有确定的颜色,因此形成了一幅完整的图像。通常使用的图像大部分是位图,如相机拍摄的照片,因为位图可以表示图像的细节,能够较好的还原现实场景。位图的缺点是体积比较大,因此产生了很多压缩图像格式来存储位图图像,目前应用最广的是JPEG格式,另外还有GIF、PNG等。而且位图在放大时,会出现“锯齿”现象,就是所谓的失真,这也由位图的本质特点决定。所以在现实中,还需要使用另外一种图像格式:矢量图。

矢量图在一些商标设计上使用比较多,矢量图同位图不同,矢量图是利用数学公式通过线段绘制出来的,所以不管如何放大都不会出现失真现象,但是矢量图不能描述非常复杂的图像。所以各种图形图案、CAD软件等等都是使用矢量格式来保存文件。


2.显示

跟PE文件有32位和64位一样,位图也是要分位数的,分类依据主要是像素的位数。

位图的每个像素采用不同的位数(即BMP的图像深度),就可以表示出不同的颜色,不同位图的颜色数量计算如下:

  • 4位图像:2^4=16
  • 8位图像:2^8=256
  • 16位图像:2^16=65536
  • 24位图像:2^24=16777216

n位图说明n个二进制位是一个像素,这一个像素中再分配给透明度和RGB三原色各一个数值,每一个数值代表该颜色的亮度,因为没有亮度分量,亮度直接可以从颜色分量中得到,每一颜色分量值的范围都是0~255,某一颜色分量的值越大,就表示这一分量的亮度越高,所以可以理解为一个像素由三个平面叠加【一个平面(n/4位二进制数)代表RGB中的一个颜色或一个元素】,无数个这样的像素叠加形成一个BMP图像。

对于现在的计算机,一般使用32位来表示颜色,32位平分给四个分量,也就是每个分量8位。(红蓝绿每种颜色可以分8种,另一个分量是透明度)这三种颜色组合起来就有256 * 256 * 256 = 16777216种颜色,基本可以表示大自然的任意色彩。


3.彩色图转灰白图原理

在24位彩色图像中,3个字节分别表示R、G、B三种颜色分量,在RGB表示方式中,。一个真彩色像素点转换为灰度图时它的亮度值则采用了心理学灰度公式计算:

Y=0.299R+0.587G+0.114B

使用上述公式转换时得到的灰度图最接近人眼对灰度图的感觉。灰度图中颜色数量一共只有256种(8bit),所以转换后的图像保存为8位格式(8位图像),可以节省空间。因此彩色图像转变为灰度图像是不可逆的过程。调色板中可以保存256颜色,所以可以正好将256种灰度颜色保存到调色板中。


二、BMP图像

1.BMP/.JPG/.PNG

每张图片都是由像素块组成的,每个像素块都是可以由三原色组合而成的,三原色中的每一种颜色都可以用二进制来表示,不同的组合方案则显示不同颜色,在计算机显示图片当中会有压缩图片或解析图片的软件,于是计算机就能够显示图片了。

  • bmp: BMP图像文件(Bitmap-File)格式是Windows采用的图像文件存储格式,在Windows环境下运行的所有图像处理软件都支持这种格式。Windows 3.0以后的BMP文件都是指设备无关位图(DIB,device-independent bitmap)。BMP位图文件默认的文件扩展名是.BMP,有时它也会以.DIB或.RLE作扩展名。图片需要保存多少个点的数据就是实实在在多少个点的数据 ,没有进行压缩,类比源代码,这便是最原始的图像。

  • jgp: 图片进行了压缩 ,两种多种颜色的色差看起来不明显,将它们归纳为同一种颜色显示。JPEG的压缩方式通常是破坏性资料压缩,即在压缩过程中图像的品质会遭受很大的破坏。一张图片在多次覆盖保存后,图片会逐渐失真。

  • png: 算法类似于jpg ,是一种无损数据压缩,根据人的视觉在人可识别的颜色范围外的颜色被算法隐藏。

相对占用空间:BMP > PNG > JPG

2.组成

BMP图像文件由4部分组成:

  • 文件头(BMP file header):文件的格式、大小等信息,通常,在BMP图片装载入内存后,此部分将被抛弃;
  • 信息头(Bitmap information):每像素所使用的位数、图片宽度、高度(一般为负数,当信息头的参数高为正数时,图片将是倒立的)、压缩方式、颜色索引等信息。虽然这个结构标准不一,但大多数BMP图片依然是windows NT是发布的组成结构,不同的BMP格式标准的区别主要在于信息头的大小,这可以通过信息头的第一个参数(长为四个字节的DIB Header Size)区分分辨;
  • 调色板(color palette):可选,一般位数小于8的时候存在,如使用索引来表示图像,调色板就是索引与其对应的颜色的映射表,为节省空间而存在;
  • 位图数据(bitmap data):图像数据区,也叫像素组,记录每个像素点具体的颜色或颜色索引;
    由于计算机一次处理四字节的效率更好,所以像素组的扫描行有比特补零的标准(字节对齐)。也就是说如果一张图片的尺寸是121120,它的BMP的像素组尺寸实际是124120,多出的位置零,但信息头的参数宽不因此改变,是121

具体结构字段如下,为了更直观的看到,我们结合案例,同时给出BMP案例图。
在这里插入图片描述

(1)文件头

typedef struct tagBITMAPFILEHEADER
{
UINT16 bfType;//2Bytes,必须为"BM",即0x424D,才是Windows位图文件
DWORD bfSize;//4Bytes,整个BMP文件的大小(图片大小计算:bfOffBits + 长(像素) X 宽(像素) X 位数(每个像素占的位数) 。例如对于128X128X24位的图像  bfSize=128X128X24 + 54+sizeof(RGBQUAD)*256)
UINT16 bfReserved1;//2Bytes,保留,为0
UINT16 bfReserved2;//2Bytes,保留,为0
DWORD bfOffBits;//4Bytes,文件起始位置到图像像素数据的字节偏移量,
}BITMAPFILEHEADER;

在这里插入图片描述
文件大小计算:54+1152 * 648 * 3 == 2239542

  • 位图文件头+位图信息头+调色板 的大小:54
  • 位图宽:1152(0x480)
  • 位图高:648(0x288)
  • 一个像素占的字节:24bit/8 ==3
    在这里插入图片描述

(2)信息头

typedef struct_tagBMP_INFOHEADER
{
DWORD biSize;//4Bytes ,INFOHEADER结构体大小,存在其他版本INFOHEADER,用作区分
LONG biWidth;//4Bytes,图像宽度(以像素为单位)
LONG biHeight;//4Bytes,图像高度,指明该图像是倒向的位图,还是正向的位图(+:图像存储顺序为倒向,-:图像存储顺序为正向)
WORD biPlanes;//2Bytes,图像数据平面,BMP存储RGB数据,因此总为1
WORD biBitCount;//2Bytes,图像像素位数
DWORD biCompression;//4Bytes,0:不压缩,1:RLE8,2:RLE4
DWORD biSizeImage;//4Bytes, 4字节对齐的图像数据大小
LONG biXPelsPerMeter;//4Bytes,用像素/米表示的水平分辨率
LONG biYPelsPerMeter;//4Bytes,用像素/米表示的垂直分辨率
DWORD biClrUsed;//4Bytes,实际使用的调色板索引数,0:使用所有的调色板索引
DWORD biClrImportant;//4Bytes,重要的调色板索引数,0:所有的调色板索引都重要
}BMP_INFOHEADER;

在这里插入图片描述
对比属性面板的分辨率,可以看出位图宽高是一致的。
在这里插入图片描述

(3)调色板

typedef struct_tagRGBQUAD
{
BYTE rgbBlue; //指定蓝色强度
BYTE rgbGreen;//指定绿色强度
BYTE rgbRed; //指定红色强度
BYTE rgbReserved;//保留,设置为0
}RGBQUAD;

(4)图像数据区

根据信息头的biBitCount(颜色位数)从左到右,从下到上记录位图的每一个像素值(也就是说最上面的数据其实记录的是位于图像最下面的像素)像素值也是倒着念的,原始数据是按B、G、R的顺序排列的。

  • 当biBitCount=1时,8个像素占1个字节,黑白图,位图数据是指向调色板的索引序号,可以根据需要选择压缩与不压缩;
  • 当biBitCount=4时,2个像素占1个字节,16色图,位图数据是指向调色板的索引序号,可以根据需要选择压缩与不压缩,如果选择压缩,则采用RLE4算法;
  • 当biBitCount=8时,1个像素占1个字节,256色图,位图数据是指向调色板的索引序号,可以根据需要选择压缩与不压缩,如果选择压缩,采用的是RLE8算法;
  • 当biBitCount=16时,1个像素占2个字节,图像的颜色直接在位图数据中给出;有RGB555(5位红5位绿5位蓝)和RGB565(5位红6位绿5位蓝)两种情况,BMP图片不压缩时(信息头的参数Compress = 0),使用的就是RGB555模式,即R、G、B三个通道分别用五位,最高位悬空置零。
  • 当biBitCount=24位时,1个像素占3个字节,R、G、B三个通道分别用八位,真彩色图
  • 当biBitCount=32位时,R、G、B三个通道依旧分别用八位,除了RGB,还有Alpha通道,即透明色。

之前说过,扫描行必须要是4的倍数,所以像素尺寸大小计算就是补零后的行像素数*高像素数(如果要计算文件大小还应该先乘位数,再加上信息头文件头,调色板),代码表示如下:

DataSizePerLine = (biWidth*biBitCount+31)/8;//一个扫描行所占的字节数
DataSizePerLine=DataSizePerLine/4*4;//字节数必须是4的倍数
Datasize=DataSizePerLine*biHeight;//计算大小

参考位图(bmp)文件格式分析

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

计算机图像显示原理与BMP图像文件格式 的相关文章

  • innerText和innerHTML区别

    innerText和innerHTML区别 尽管DOM带来了动态修改文档的能力 但对开发人员来说 这还不够 IE4 0为所有的元素引入了两个特性 以更方便的进行文档操作 这两个特性是innerText和innerHTML 其中innerTe

随机推荐

  • Oracle:重复数据去重,只取其中一条(最新时间/其他字段排序规则)数据

    一 问题 一个会话id代表一个聊天室 返回该聊天室最新的一条数据显示在会话列表 二 解决思路 使用row number over 分组排序功能 来解决该问题 1 语法格式 row number over partition by 分组列 o
  • TMOD、SCON、PCON寄存器的配置

    TMOD控制寄存器 TMOD是定时器 计数器模式控制寄存器 它是一个逐位定义的8为寄存器 但只能使用字节寻址 其各位是 由上图我们就可以看出 这个寄存器控制了两个定时器 计数器 寄存器的高四位控制定时器1 低四位控制定时器0 GATE 门控
  • 数据分析毕业设计 二手房数据爬取与分析可视化系统 -python

    1 前言 这两年开始毕业设计和毕业答辩的要求和难度不断提升 传统的毕设题目缺少创新和亮点 往往达不到毕业答辩的要求 这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求 为了大家能够顺利以及最少的精力通过毕设 学长分享优质毕业设计项
  • Air700E开发板

    文章目录 基础资料 概述 主要功能 外设分布 PinOut 管脚定义 管脚功能说明 固件升级 正常开机模式 下载模式 IO 电平选择 基础资料 Air700E文档中心 概述 EVB Air700E 开发板是合宙通信推出的基于 Air700E
  • 去除VsCode代码前面的小点点

    去除VsCode代码前面的小点点 去除图片中的点 步骤 File gt Preferences gt Setting 搜索RenderWhitespace 将Text Editor下的Editor Render Whitespace改为no
  • peewee-async使用描述

    1 peewee async是一个为peewee ORM 提供由asyncio支持的异步io库 在单独使用peewee连接池连接时 同时使用到了async和await协程 这样操作会阻塞整个进程 因为tornado是单进程 必须数据库也使用
  • 数据库的简介与类型 #CSDN博文精选# #IT技术# #数据库#

    大家好 小C将继续与你们见面 带来精选的CSDN博文 又到周一啦 上周的系统化学习专栏已经结束 我们总共一起学习了20篇文章 这周将开启全新专栏 放假不停学 全栈工程师养成记 在这里 你将收获 将系统化学习理论运用于实践 系统学习IT技术
  • 高通 AR Unity 虚拟按钮

    1 虚拟按钮是图像上的目标 用户可以在现实世界中触摸 以触发一个动作的 热点 现有的图像目标的一个实例的VirtualButton预制拖动到场景中添加虚拟按键 平移和缩放按钮 以匹配所需的位置 并给它一个名字 虚拟的按钮添加这样写入到con
  • 计算机视觉概述

    关注公众号 CV算法恩仇录 本文介绍了计算机视觉的主要任务及应用 全文大约 3500 字 阅读时间 10 分钟 人们或许没有意识到自己的视觉系统是如此的强大 婴儿在出生几个小时后能识别出母亲的容貌 在大雾的天气 学生看见朦胧的身体形态 能辨
  • v-viewer 插件图片点击放大预览的几种使用方法

    官网git地址 https github com mirari v viewer 最终效果如下 ps 按钮样式都是可以根据自己需求调整的 第一种使用方法 支持UMD用法 建议把v viewer相关的js和css文件下载到本地引用 可以到上面
  • set容器、map容器

    set multiset 容器 set基本概念 简介 所有元素都会在插入时自动被排序 本质 set multiset属于关联式容器 底层结构是用二叉树实现 set和multiset区别 set不允许容器中有重复的元素 multiset允许容
  • elk笔记23--定期清理索引

    elk笔记23 定期清理索引 1 介绍 2 方案 代码 2 1 方案介绍 2 2 代码 2 3 测试 3 注意事项 4 说明 1 介绍 在生产环境中 如果日志量过大 就会导致集群持续产生很多索引 占用很多存储空间 因此需要定期清理索引 确保
  • 套圈·分治

    套圈 题目信息 输入 测试样例 解答 想法 题目信息 Have you ever played quoit in a playground Quoit is a game in which flat rings are pitched at
  • 闭环步进与伺服电机差异

    当给步进电机配备编码器闭环控制后 从广义上来看 闭环步进电机和伺服电机两者是没有什么大的区别 但是 要详细区分闭环步进电机和伺服电机的不同之处 你需要先了解一下伺服电机和步进电机的差异 闭环步进电机是在步进电机上加装了高精度的编码器 用伺服
  • 理解扩散模型:Diffusion Models & DDPM

    引言 在前面的博客中 我们讨论了生成模型VAE和GAN 近年来 新的生成模型 扩散模型受到越来越多的关注 因此值得好好去研究一番 扩散模型 Diffusion Models 最早由 2 于2015年提出 但直到2020年论文 3 发表之后才
  • 不断发展中的自然语言处理技术,会在未来消灭“笔”和“键盘”吗?

    花满楼 发布于2014 07 20 23 11 00 目前 Siri 和 Google Now 的语音识别技术虽然还不完善 但在未来却很可能威胁到文字的地位 我们手写或者打字 在当下已经成为了无比繁重的劳动 不断的输入各种文字信息 在网页上
  • 快手20230807提前批一面

    Q and A 面试官 你是专硕还是学硕 能不能让实习 研究方向 面试官 项目基于什么背景做的 xxx 面试官 介绍一下框架 xxxx 面试官 里面中用了什么技术 首先的话 服务层使用了springboot 并且使用了mp 持久化使用了my
  • angular7主题样式在线切换

    参考ng alain和delon 思路就是动态加载css文件 代码实现 写两套less文件 分别为light less和dark less 用相关插件将less文件转为一个js对象 less vars to js 插件 function g
  • Road Construction 【POJ - 3352】【Tarjan边双连通】

    题目链接 题意 给一个无向连通图 至少添加几条边使得去掉图中任意一条边不改变图的连通性 即使得它变为边双连通图 思路 就是去求一个缩点之后求度为1的点的个数 然后用 ans 1 2就可以得到最后的答案了 include
  • 计算机图像显示原理与BMP图像文件格式

    本篇文章详细讲述图像文件 里面有一些阐述为个人理解 如有不对的地方欢迎指正 后续会修正补全 计算机图像显示原理与BMP图像的文件格式 一 计算机图像显示原理简述 1 计算机图像分类 2 显示 3 彩色图转灰白图原理 二 BMP图像 1 BM