C语言读取BMP格式图片
C 语言读取BMP 格式图片
以下摘自维基百科,自由的百科全书
BMP 取自位图BitMaP 的缩写,也称为DIB (与设备无关的位图)是微软视窗图形
子系统(Graphics Device Interface)内部使用的一种位图图形格式,它是微
软视窗平台上的一个简单的图形文件格式。
图像通常保存的颜色深度有2 (1 位)、16 (4 位)、256 (8 位)、65536 (16
位)和1670 万(24 位)种颜色(其中位是表示每点所用的数据位)。8 位图像
可以是索引彩色图像外,也可以是灰阶图像。表示透明的alpha 通道也可以保存
在一个类似于灰阶图像的独立文件中。带有集成的alpha 通道的32 位版本已经
随着Windows XP 出现,它在视窗的登录和主题系统中都有使用,但是还没有多
少图像编辑软件支持。
存储算法
BMP 文件通常是不压缩的,所以它们通常比同一幅图像的压缩图像文件格式要大
很多。例如,一个800×600 的24 位几乎占据1.4MB 空间。因此它们通常不适合
在因特网或者其他低速或者有容量限制的媒介上进行传输。
根据颜色深度的不同,图像上的一个像素可以用一个或者多个字节表示,它由
n/8 所确定(n 是位深度,1 字节包含8 个数据位)。图片浏览器等基于字节的
ASCII 值计算像素的颜色,然后从调色板中读出相应的值。更为详细的信息请参
阅下面关于位图文件的部分。
n
n 位2 种颜色的包含调色板的位图近似字节数可以用下面的公式计算:
BMP 文件大小 ,其中高度(height)和宽
度(width)都以像素为单位。
需要注意的是上面公式中的54 是位图文件的文件头, 是彩色调色板的大
小。 如果位图文件不包含调色板,如24 位,32 位位图,则位图的近似字节数
可以用下面的公式计算:
BMP 文件大小 ,其中高度(height)和宽度(width)
都以像素为单位。
另外需要注意的是这是一个近似值,对于n 位的位图图像来说,尽管可能有最多
种颜色,一个特定的图像可能并不会使用这些所有的颜色。由于彩色调色板
仅仅定义了图像所用的颜色,所以实际的彩色调色板将小于 。
如果想知道这些值是如何得到的,请参考下面文件格式的部分。
由于存储算法本身决定的因素,根据几个图像参数的不同计算出的大小与实际的
文件大小将会有一些细小的差别。
典型的文件格式
典型的位图文件格式通常包含下面几个数据块:
位图头:保存位图文件的总体信息。
位图信息:保存位图图像的详细信息。
调色板:保存所用颜色的定义。
位图数据:保存一个又一个像素的实际图像。
下面的部分将会详细地描述位图文件中保存的数据。需要注意的是这是标准位图
的文件格式,其他一些位图图像可能根据生成文件的应用程序不同所使用格式可
能会有细微的区别。
位图头
这部分是识别信息,典型的应用程序会首先普通读取这部分数据以确保的确是位
图文件并且没有损坏。
字节 #0-1 保存位图文件的标识符,这两个字节的典型数据是BM。
字节 #2-5 使用一个dword 保存位图文件大小。
字节 #6-9 是保留部分,留做以后的扩展使用,对实际的解码格式没有影响。
字节 #10-13 保存位图数据位置的地址偏移,也就是起始地址。
位图信息
这部分告诉应用程序图像的详细信息,在屏幕上显示图像将会使用这些信息,它
从文件的第15 个字节开始。
字节 #14-17 定义以下用来描述影像的区块(BitmapInfoHeader)的大小。
它的值是:40 - Windows 3.2、95、NT、12 - OS/2 1.x、240 - OS/2 2.x
字节 #18-21 保存位图宽度(以像素个数表示)。
字节 #22-25 保存位图高度(以像素个数表示)。
字节 #26-27 保存所用彩色位面的个数。不经常使用。
字节 #28-29 保存每个像素的位数,它是图像的颜色深度。常用值是 1、4、
8 (灰阶)和24 (彩色)。
字节 #30-33 定义所用的压缩算法。允许的