bmp图片处理简单总结

来源:互联网 发布:智盟软件电话 编辑:程序博客网 时间:2024/05/16 17:22

1 图像以24位图像为主,即RGB三种颜色各用8bit来表示,这样的图像我们称为真彩色,这种情况下是不需要调色板的,也就是所位图信息头后面紧跟的就是位图数据了,位图文件从文件头开始偏移54个字节就是位图数据了,这其实说的是2432位图的情况。

2 BMP文件中,如果一个数据需要用几个字节来表示的话,那么该数据的存放字节顺序为低地址存放低位数据,高地址存放高位数据如数据0x1756在内存中的存储顺序为: 56 17:地址低—>

3 图片的位深度

根据三原色原理,图像的每一点其实是由三点组成,电脑来说就是红绿蓝,这三个点的不同亮度所呈现给用户的感觉就是不同的颜色。
而所谓的深度,就是各色素的从最暗到最亮的“刻度”范围,刻度越多,自然色彩控制也就越逼真,反之就失真。
所以,32位所表现的的色彩当然要比24位逼真,24位当然要比16位逼真,以此类推。
但是,深度越大,也就意味着图像文件越大,电脑处理起来时间也就越长,占用的空间也就越可观,这要你自己选择。

位图:每像素占字节数
4、图片大小.位图图片大小和像素有关。像素:图片上的1个点就是1个像素。对数字化的图片来说,一张图片就是像素点排列组成的的。简单来说就是衡量图片大小的参数。
5、分辨率:分辨率通常是指1英寸长度上的像素(点)数,表示一张图片上像素之间排列的疏密程度。
6、色位,色深。指单个像素(点)自身的细化程度,能容纳颜色程度。单位bit,也称色位深度。是衡量图片细腻/粗糙的一个参数。


简单介绍下bmp图片的各个组成部分:bmp文件头、位图信息头、调色板、位图数据

一、bmp文件头
Windowsbmp文件头定义了如下结构体:typedef struct tagBITMAPFILEHEADER 
{  
UINT16 bfType;      0-1
:文件类型2byte
DWORD bfSize;:    2-5
    位图文件的大小(字节为单位)4byte00000290h=656Byte
UINT16 bfReserved1;        6-7
:保留位
UINT16 bfReserved2;:       8-9
:保留位
DWORD bfOffBits;a-d:       
文件头到位图需要偏移的字节00000036h=54byte(字节)说明没有调色板
} BITMAPFILEHEADER;
bitmapfileheader

文件头包含的信息,各组成部分的含义:

举例:(找到一个bmp图片的数据)

 0x00-0x01:     文件类型2byte
 0x02-0x05
     位图文件的大小(字节为单位)4byte00000290h=656Byte
 0x06-0x07
:     保留位
 0x08-0x09
:     保留位
 0x0a-0x0d:        
文件头到位图需要偏移的字节00000036h=54byte(字节)说明没有调色板

二:位图信息头


0x0E-0x11: 00000028h=40byte,bitmapinfoheader结构需要40个字节,信息头需要40个字节

0x12-0x15:    00000014h=20byte,宽度25像素,跟文件一样:由此可以读取bmp文件信息时,第12位就是宽度,第16位就是高度

0x16-0x19:    0000000a=10byte,高度10像素,是个正数,说明图形由左下角向右上角排列

0x1A-0x1B:    0001:固定值

0x1C-0x1D:    0018h=24,每个像素占24byte (真彩色) =byte数/像素,---位深

     :0008h,每个像素占8个byte,共有256个颜色:2^8

0x1E-0x21:  00000000图像不压缩,为0:BI_RGB

0x22-0x25:  0000025a,当为BI_RGB可设置为0,图像的大小

0x26-0x29:  00000b12,水平分辨率,像素/米

0x2a-0x2d:     00000b12,垂直分辨率,像素/米

0x2e-0x31:     00000000调色板

0x32-0x35:     00000000

我们知道Windows默认的扫描的最小单位是4字节,如果数据对齐满足这个值的话对于数据的获取速度等都是有很大的增益的。因此,BMP图像顺应了这个要求,要求每行的数据的长度必须是4的倍数,如果不够需要进行比特填充(以0填充),这样可以达到按行的快速存取。这时,位图数据区的大小就未必是 图片宽×每像素字节数×图片高能表示的了,因为每行可能还需要进行比特填充。填充后的每行的字节为:,BPP为每像素的比特数。

在程序中,我们可以表示为:

intiLineByteCnt = (((m_iImageWidth * m_iBitsPerPixel) + 31) >> 5) <<2;

这样,位图数据区的大小为:

  m_iImageDataSize =iLineByteCnt * m_iImageHeight;

我们在扫描完一行数据后,也可能接下来的数据并不是下一行的数据,可能需要跳过一段填充数据:

  skip= 4 - ((m_iImageWidth * m_iBitsPerPixel)>>3) & 3;

三 调色板

调色板其实是一张映射表,标识颜色索引号与其代表的颜色的对应关系。它在文件中的布局就像一个二维数组palette[N][4],其中N表示总的颜色索引数,每行的四个元素分别表示该索引对应的BGRAlpha的值,每个分量占一个字节。如不设透明通道时,Alpha0。因为前面知道,本图有256个颜色索引,因此N = 256。索引号就是所在行的行号,对应的颜色就是所在行的四个元素。

 这次举得两个例子都是没有调色板的:简单解释一下调色板,就是这个图片有几种颜色,将每个颜色对应的B G R Alpha的值与颜色号一一对应起来,通过在位图数据中的颜色序列,显示出相应的颜色。


四 位图数据

24RGB按照BGR的顺序来存储每个像素的各颜色通道的值,一个像素的所有颜色分量值都存完后才存下一个下一个像素,不进行交织存储。32位数据按照BGRA的顺序存储,其余与24位位图的方式一样。

由于本图没有用到调色板,所以这里的位图数据不是索引而是实际的像素值,5d c8….的排列是按照实际图片的最左下角开始的