图像处理之对BMP图片的认识

  学了图像处理有一段时间了,有没有发现用的图片都是BMP格式的呢?

那么我们又为什么总用BMP格式的图片呢?

今天我也是怀着一颗好奇心把有关图片格式的知识整理了一下。

希望网友们能对图片有新的认识。

首先是图片格式大全:

BMP格式:Windows系统下的标准位图格式,未经过压缩,一般图像文件会比较大。在很多软件中被广泛应用. JPEG格式:也是应用最广泛的图片格式之一,它采用一种特殊的有损压缩算法,将不易被人眼察觉的图像颜色删除,从而达到较大的压缩比(可达到2:1甚至40:1),因为JPEG格式的文件尺寸较小,下载速度快,所以是互联网上最广泛使用的格式! GIF格式:最大的特点是不仅可以是一张静止的图片,也可以是动画,并且支持透明背景图像,适用于多种操作系统,“体型”很小,网上很多小动画都是GIF格式。但是其色域不太广,只支持256种颜色. PSD格式:Photoshop的专用图像格式,可以保存图片的完整信息,土层,通道,文字都可以被保存,图像文件一般较大。 PNG格式:与JPG格式类似,网页中有很多图片都是这种格式,压缩比高于GIF,支持图像透明,可以利用Alpha通道调节图像的透明度,是网页三剑客之一Fireworks的源文件。 TIFF格式:它的特点是图像格式复杂、存贮信息多,在Mac中广泛使用的图像格式,正因为它存储的图像细微层次的信息非常多,图像的质量也得以提高,故而非常有利于原稿的复制。很多地方将TIFF格式用于印刷. TGA格式:TGA的结构比较简单,属于一种图形、图像数据的通用格式,在多媒体领域有着很大影响,在做影视编辑时经常使用,例如3DS MAX输出TGA图片序列导入到AE里面进行后期编辑。 EPS格式:苹果Mac机的用户则用得较多。它是用PostScript语言描述的一种ASCII码文件格式,主要用于排版、打印等输出工作。
          想必各位对此心中已经有了大概了吧。下面当然是对BMP详细解析了。静下心来,慢慢看吧。

BMP文件格式

BMP(Bitmap-File)图形文件,又叫位图文件,是Windows采用的图形文件格式,在Windows环境下运行的所有图象处理软件都支持BMP图象文件格式。Windows系统内部各图像绘制操作都是以BMP为基础的。一个BMP文件由四部分组成:

一个BMP文件,可以用代码表示,如下:

typedef struct tagBITMAP_FILE{BITMAPFILEHEADER bitmapheader;BITMAPINFOHEADER bitmapinfoheader;PALETTEENTRY palette[256];UCHAR *buffer;   //UCHAR 大小1字节(同BYTE), 在VC6下} BITMAP_FILE;

1、 BMP文件头:BITMAPFILEHEADER

typedef struct tagBITMAPFILEHEADER { // bmfh WORD    bfType; DWORD   bfSize; WORD    bfReserved1; WORD    bfReserved2; DWORD   bfOffBits;
} BITMAPFILEHEADER;
bfType 说明文件的类型,该值必需是0x4D42,也就是字符'BM',否则表示根本不是BMP
bfSize 说明该位图文件的大小,用字节为单位
bfReserved1 保留,必须设置为0
bfReserved2 保留,必须设置为0
bfOffBits 说明从文件头开始到实际的图象数据之间的字节的偏移量。这个参数是非常有用的,因为位图信息头和调色板的长度会根据不同情况而变化,所以你可以用这个偏移值迅速的从文件中读取到位数据。

2、位图信息段:BITMAPINFOHEADER

typedef struct tagBITMAPINFOHEADER{ // bmih DWORD  biSize; LONG   biWidth; LONG   biHeight; WORD   biPlanes; WORD   biBitCount DWORD  biCompression; DWORD  biSizeImage; LONG   biXPelsPerMeter; LONG   biYPelsPerMeter; DWORD  biClrUsed; DWORD  biClrImportant;
} BITMAPINFOHEADER; 
biSize 说明BITMAPINFOHEADER结构所需要的字节数
biWidth 说明图象的宽度,以象素为单位
biHeight 说明图象的高度,以象素为单位。注:这个值除了用于描述图像的高度之外,它还有另一个用处,就是指明该图像是倒向的位图,还是正向的位图。如果该值是一个正数,说明图像是倒向的,即:数据的第一行其实是图像的最后一行,如果该值是一个负数,则说明图像是正向的。大多数的BMP文件都是倒向的位图,也就是时,高度值是一个正数。
biPlanes 表示bmp图片的平面属,显然显示器只有一个平面,所以恒等于1
biBitCount 说明比特数/象素,其值为1、4、8、16、24、或32。
biCompression 说明图象数据压缩的类型,其中:

BI_RGB:没有压缩

BI_RLE8:每个象素8比特的RLE压缩编码,压缩格式由2字节组成(重复象素计数和颜色索引);

BI_RLE4:每个象素4比特的RLE压缩编码,压缩格式由2字节组成

BI_BITFIELDS:每个象素的比特由指定的掩码决定。

BI_JPEG:JPEG格式

biSizeImage 说明图象的大小,以字节为单位。当用BI_RGB格式时,可设置为0。
biXPelsPerMeter 说明水平分辨率,用象素/米表示。
biYPelsPerMeter 说明垂直分辨率,用象素/米表示。
biClrUsed 说明位图实际使用的彩色表中的颜色索引数(设为0的话,则说明使用所有调色板项)。
biClrImportant 说明对图象显示有重要影响的颜色索引的数目,如果是0,表示都重要。

3、调色板

上面这张BMP图片是否有调色板呢?答案是否定的。

因为从bfOffBits = 54字节可以看出,刚好是sizeof(BITMAPFILEHEADER )+sizeof(BITMAPINFOHEADER);

那么究竟调色板是什么东西?有什么用?为什么我们这种图片不带调试板呢?

我们先来说说三元色RGB概念。

我们知道,自然界中的所有颜色都可以由红、绿、蓝(R,G,B)组合而成。有的颜色含有红色成分多一些,如深红;有的含有红色成分少一些,如浅红。针对含有红色成分的多少,可以分成0到255共256个等级,0级表示不含红色成分;255级表示含有100%的红色成分。同样,绿色和蓝色也被分成256级。这种分级概念称为量化。

表1.1 常见颜色的RGB 组合值

当一幅图中每个象素赋予不同的RGB值时,能呈现出五彩缤纷的颜色了,这样就形成了彩色图。

让我们举例说明什么是调色板?为什么需要调色板?

有一个长宽各为200个象素,颜色数为16色的彩色图,每一个象素都用R、G、B三个分量表示。因为每个分量有256个级别,要用8位(bit),即一个字节(byte)来表示,所以每个象素需要用3个字节。整个图象要用200×200×3,约120k字节,可不是一个小数目呀!如果我们用下面的方法,就能省的多。

因为是一个16色图,也就是说这幅图中最多只有16种颜色,我们可以用一个表:表中的每一行记录一种颜色的R、G、B值。这样当我们表示一个象素的颜色时,只需要指出该颜色是在第几行,即该颜色在表中的索引值。举个例子,如果表的第0行为255,0,0(红色),那么当某个象素为红色时,只需要标明0即可。

让我们再来计算一下:16种状态可以用4位(bit)表示,所以一个象素要用半个字节。整个图象要用200×200×0.5,约20k字节,再加上表占用的字节为3×16=48字节.整个占用的字节数约为前面的1/6,省很多吧?

这张R、G、B的表,就是我们常说的调色板(Palette),另一种叫法是颜色查找表LUT(Look Up Table),似乎更确切一些。调色板在windows里的结构定义如下:

typedef struct tagPALETTEENTRY { // pe BYTE peRed; BYTE peGreen; BYTE peBlue; BYTE peFlags;
} PALETTEENTRY;

那么为什么我们这张BMP不带调色板呢?

是因为我们这张BMP是24位真彩色的BMP,所谓真彩色图(true color),就是它的颜色数高达256×256×256种,也就是说包含我们上述提到的R、G、B颜色表示方法中所有的颜色。真彩色图并不是说一幅图包含了所有的颜色,而是说它具有显示所有颜色的能力,即最多可以包含所有的颜色。表示真彩色图时,每个象素直接用R、G、B三个分量字节表示,而不采用调色板技术。原因很明显:如果用调色板,表示一个象素也要用24位,这是因为每种颜色的索引要用24位(因为总共有256×256×256种颜色,即调色板有256×256×256行),和直接用R,G,B三个分量表示用的字节数一样,不但没有任何便宜,还要加上一个256×256×256×3个字节的大调色板。所以真彩色图直接用R、G、B三个分量表示,它又叫做24位色图。

这么看来BMP文件不能一概而论了,其是否用调色板或者是RGB掩码,位图数据中的数据的真正含义直接与biBitCount 有关,不同类型的位图,其中的设计原理也不同,下面对此作一个对比:

4、位图数据

上面基本把调色板及相关取色策略梳理清楚了,看下面的例子24位BMP图,每3个字节表示一个像素,3个字节分别表示R、G、B的分量值

这里每3个字节表示一个像素的颜色,注意:由于位图信息头中的图像高度是正数,所以位图数据在文件中的排列顺序是从左下角到右上角,以行为主序排列的。

这是我见过最详细的资料了,整理了一下分享给大家。

参考资料:

http://www.cnblogs.com/xiekeli/archive/2012/05/09/2491191.html

图像处理之对BMP图片的认识相关推荐

  1. 【数字图像处理】BMP图片的读取显示存储(C语言实现)

    (一)背景介绍 这段时间接到了一个新活,是关于图像处理的一个探地摄像头的项目.所以也差不多是时候开始学习一下数字图像处理的知识了.本来我们的方案是直接移植opencv,编译一下以后其他就基本啥都不用管 ...

  2. 【图像处理基础】C语言对bmp图片进行处理

    1.bmp文件的定义 #ifndef IMAGE_H #define IMAGE_H void image_info(FILE* file); void image_save(FILE *file); ...

  3. MFC 对话框Picture Control(图片控件)中静态和动态显示Bmp图片

    最近有同学问我如何实现MFC基于对话框在图片控件中加载图片?其实使用MFC显示图片的方法各种各样,但是还是有些同学不知道怎样显示.以前在<数字图像处理>课程中完成的软件都是基于单文档的程序 ...

  4. c++jpg转bmp_用C++加速julia:BMP图片读取

    最近写了一个程序,需要大批量地读取8位的BMP格式的灰度图,程序写完profiler一看,竟然读图和处理的时间不相上下,这是万万不可接受的.经过一番折腾,最后决定用C++来加速8位BMP图片的读取.目 ...

  5. C语言 BMP图片的中值滤波

    工作用到了这方面的知识,记录一下,用大白话说明一下. 一.BMP图片 1.一个BMP格式的图片可以分为三块,文件头信息,位图信息,位图数据(有的带调色板,可选). BMP文件头:    存储了该文件的 ...

  6. C++ 保存bmp图片

    在 C 语言中,你可以使用 Windows 图像处理库(Windows GDI)来保存 BMP 图片.你需要使用到两个重要的函数:CreateBitmap 和 SaveBitmap. CreateBi ...

  7. Linux下BMP图片缩放

    Linux下BMP图片缩放   MP是英文Bitmap(位图)的简写,它是Windows操作系统中的标准图像文件格式,能够被多种Windows应用程序所支持.随着Windows操作系统的流行与丰富的W ...

  8. 基于STM32的BMP图片解码灰度化以及缩放

    平台:STM32F1+FATFS+SD卡 基于STM32的BMP图片处理 处理结果 原图 test.bmp 灰度图 gray.bmp 缩放 zoom.bmp 代码实现 调试过程遇到的几个问题 双线性插 ...

  9. bmp文件头_「正点原子FPGA连载」第十九章SD卡读BMP图片LCD显示

    1)摘自[正点原子]领航者 ZYNQ 之嵌入式开发指南 2)实验平台:正点原子领航者ZYNQ开发板 3)平台购买地址:https://item.taobao.com/item.htm?&id= ...

  10. python运行完不能显示图_【已解决】Python中通过Image的open之后,去show结果打不开bmp图片,无法正常显示图片...

    [问题] 在windows的cmd命令行下,使用Python的PIL库打开并显示一个jpg图片:openedImg = Image.open(saveToFile); print "open ...

最新文章

  1. 【软件工程】数据流图 ( 数据字典 | 数据流图平衡原则 | 父图与子图平衡 | 子图内平衡 | 数据流图绘制原则 )
  2. 在onelogin中使用OpenId Connect Implicit Flow
  3. matlab拟合高次相,matlab 多元高次非线性函数拟合,回归,求教高手!
  4. maven jar包下载
  5. jms是java平台中面向_面向Web的JMS应用系统
  6. 00004 死亡阴影.0001:配置文件的Unity包与修改
  7. 下载到的电子书格式是Mobi,这种格式能否在IOS手机上打开?
  8. 面试经常考的五个Sql查询
  9. Windows 回声消除 怎么外放音乐不让对方听到
  10. 计算机的文件夹打不开了,文件夹打不开,详细教您文件夹打不开怎么办
  11. LTE语音业务 - VOLTE
  12. 哪一个国家耗巨资请熊猫去的_熊猫4.0:一个月过去了,复苏迹象
  13. 华为OD机试 - 预订酒店(Java JS Python)
  14. react钩子_了解用户的React钩子
  15. github使用教程linux,GitHub Linux下使用方法
  16. Linux中关于安装包的分析。——Arvin
  17. 查找二叉树(BST)
  18. 蓝牙读写卡器_蓝牙卡复制方法
  19. 跟sky学数字IC前端设计:数字IP_FPGA实战
  20. P2中ZYNQ的PS控制PL端LED

热门文章

  1. sin的傅里叶变换公式_傅里叶变换的由来及复数下的傅里叶变换公式证明
  2. 入门OJ:photo
  3. 京东数科发布《京东区块链技术实践白皮书2020》(附白皮书下载链接)
  4. adb命令刷入kingroot_一加5工具箱:一加5玩机神器|刷机工具箱|解锁上锁|刷机root|解密data,一键Xposed...
  5. Android 8.0正式版彩蛋,炸了!微信8.0竟然有18个彩蛋更新!
  6. linux下载m3u8工具,m3u8命令行下载工具
  7. python人脸检测与微信小程序_微信小程序人脸识别功能
  8. EXCEL插件《二维码标签工具》
  9. 查找Linux系统中某个软件是否安装/存在
  10. PaperMax,一个可智能改重的免费论文查重网站。