24位bmp存储是按BGR BGR。。。 存的
bmp位图在存储时,图片数据部分的字节数一定是4的倍数,如果不够四的倍数,在每一行要补齐字节。
但是我们在对图像进行处理时,要注意跳过这些无效的填充数据。
调色板问题
调色板用于说明位图中的颜色,它有若干个表项,每个表项是一个RGBQUAD类型的结构,定义一种颜色。RGBQUAD结构的定义
typedef struct tagRGBQUAD
{
BYTE rgbBlure;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;//保留,必须为0
}
二、
调色板中RGBQUAD结构数据的个数有bitBitCount来确定;
当biBitCount=1,4,8时,分别有2,16,256个表项。
当biBitCount=24时,该BMP图像就是24Bit真彩图,没有调色板。
三、
位图数据内容
位图数据记录了位图的每一个像素值,记录顺序是在扫描行内从左到右,扫描行之间是从下到上。位图的一个像素值
所占的字节数由biBitCount来确定:
当biBitCount=1时,8个像素占1个字节;
当biBitCount=4时,2个像素占1个字节;
当biBitCount=8时,1个像素占1个字节;
当biTbiCount=24时,1个像素占3个字节。
24位真彩图每一行占的实际字节数()
Windows规定一个扫描行所占的字节数必须是4的倍数(即以long为单位)不足的以0填充
一个扫描行所占的字节数的计算方法
DataSizePerLine=(biwidth*biBitCount/8+3)/4*4
图片数据的大小(不压缩情况下)
DataSize=DataSizePerLine*biHeight;
//公式解释
注意:C语言的除法里,两个int相除,结果会被CUT掉——只取商而不取余数。
biwidth*biBitCount/8 好理解,就是一个扫描行的字节数,
记 b = biwidth*biBitCount/8, 那么, 原式 =(b+3)/4*4,
情况一,b是四的倍数,(b+3)/4*4 == (b/4*4 + 3/4*4) == b + 0 == b
情况二,b不是四的倍数
另 b = 4x+n,其中4x就是x的4倍数,n就是那个余数。
容易得知:1 <= n <= 3, 4 <= n+3 <= 6,
于是,原式 == (4x+n + 3)/4*4, (其中x是任意值),
== (4x/4*4 + (n+3)/4*4)
在C语言中 == 4x + 4 == (x+1)*4