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)
- BMP字节对齐
- bmp字节对齐公式
- 关于bmp 4字节对齐
- bmp图像的字节对齐问题
- BMP图四字节对齐的问题
- OpenGL保存bmp图片(字节对齐与RGB分量转换)
- C++读写BMP文件头部时的字节对齐问题
- 字节对齐在24位bmp图像读取中的使用
- LCD驱动以及BMP图四字节对齐的问题
- OpenGL保存bmp图片(字节对齐与RGB分量转换)
- 字节对齐
- 字节对齐
- 字节对齐
- 字节对齐
- 字节对齐
- 字节对齐
- 字节对齐
- 字节对齐
- ArcGIS API for silverlight 开发记录
- 谈一下在网站链接中带斜线”/”对网站收录的影响
- 第四周上机任务项目二----三角形类
- IOS长按事件--UILongPressGestureRecognizer
- MyEclipse连接MySQL java.lang.ClassNotFoundException: org.gjt.mm.mysql.Driver
- BMP字节对齐
- 超简洁的响应式幻灯 - unslider
- 获得Android 设备的IMEI 和 IMSI
- 分享XAML图标的网站
- 关于Operation Dashboard的补充
- hive的启动方式
- HDU4503 湫湫系列故事——植树节
- c 将大写字符改成小写字母
- 小鸟初学设计模式(五)适配器模式