BMP字节对齐

来源:互联网 发布:usb端口控制软件 编辑:程序博客网 时间:2024/06/06 03:51

BMP字节对齐

最近做的プロトタイプ涉及到黑白,灰色,彩色BMP转PDF的问题。

其中,BMP读取显示时要4位字节对齐原因和算法总结如下

原因

1、    内存分配单位是32位的,即4字节

2、    位图中每行象素的数据是连续的,而下一行不能和上一行共一个分配单元(4字节),所以每行象素的数据长度必须是4字节的倍数

算法

具体代码如下。返回值为一个扫描行所占的实际字节数。

int   GetImageWidthByte(

const BITMAPINFOHEADER* bmpInfoHeader)

{

int       widthByte; //一个扫描行所占的字节数

int      nwidthByte //一个扫描行所占的实际字节数(4位字节后)

switch (bmpInfoHeader->biBitCount) {

//黑白

case 1:

widthByte = (bmpInfoHeader->biWidth + 7) / 8;

break;

case 4:

widthByte = bmpInfoHeader->biWidth / 2 + bmpInfoHeader->biWidth % 2;

break;

//灰色

case 8:

widthByte = bmpInfoHeader->biWidth;

break;

//24真彩色

case 24:

widthByte = bmpInfoHeader->biWidth * 3;

break;

//32真彩色

case 32:

widthByte = bmpInfoHeader->biWidth * 4;

break;

default:

return -1;

}

nwidthByte = (widthByte + 3) / 4 * 4;

return nwidthByte;

 

 

 

解析

1.BMP为4字节的方式,因此在buffer中,不论存取还是显示,都是以4字节为单位的。

2.接下来的问题就是怎么确定一行到底要怎么对齐。

首先,int 的除法结果还是int的话,会舍掉小数点取整。所以,加上3字节,再除以4,可以防止字节数变少。

例如:Width=1(位图的宽度为1像素) BitCount=24(每个像素24位,即3个字节)

①Width*BitCount/8= 3(得出占用的字节数是3)

②(3+3)/4 = 1

(如果没有加上3的话,则为3/4,商为0)

③1*4得出行字节是4

 

常用宏

如果以位(bit)为单位,则变成我们经常看到的宏

#define WIDTHBYTES(bits)    (((bits) + 31) / 32 * 4)

 

 

// 一个扫描行所占的字节数

DataSizePerLine  =  WIDTHBYTES(bmpInfoHeader->biWidth * bmpInfoHeader-> biBitCount)

 

原创粉丝点击