bitmap每行4字节对齐

说明

以下4x2, 5x2等表示 width x height。

BMP存储格式要求每行的字节数必须是4的倍数。
对于24位的位图,每个像素有3个字节。有如下公式:
补零的个数=width%4

4x2 24色

00000000h: 42 4D 4E 00 00 00 00 00 00 00 36 00 00 00 28 00 ; BMN.......6...(.
00000010h: 00 00 04 00 00 00 02 00 00 00 01 00 18 00 00 00 ; ................
00000020h: 00 00 18 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
00000030h: 00 00 00 00 00 00 FF FA F5 FF FA F5 FF FA F5 FF ; ......
00000040h: FA F5 FF FB F6 FF FB F6 FF FB F6 FF FB F6       ; 

每行 4个像素 x 3字节/像素 = 12bytes
每行 12字节 x 2行(高) = 24bytes = 0x18byts

即实际像素部分的数据如下:

FF FA F5 - FF FA F5 - FF FA F5 - FF FA F5
FF FB F6 - FF FB F6 - FF FB F6 - FF FB F6

5x2 24色

00000000h: 42 4D 56 00 00 00 00 00 00 00 36 00 00 00 28 00 ; BMV.......6...(.
00000010h: 00 00 05 00 00 00 02 00 00 00 01 00 18 00 00 00 ; ................
00000020h: 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 ; .. .............
00000030h: 00 00 00 00 00 00 FF FA F5 FF FA F5 FF FA F5 FF ; ......
00000040h: FA F5 FF FA F5 00 FF FB F6 FF FB F6 FF FB F6 FF ; .
00000050h: FB F6 FF FB F6 00                               ; .

3x5 + 1 = 16bytes,即每行最后补1个字节

FF FA F5 - FF FA F5 - FF FA F5 - FF FA F5 - FF FA F5 - 00 
FF FB F6 - FF FB F6 - FF FB F6 - FF FB F6 - FF FB F6 - 00                       

6x2 24色

00000000h: 42 4D 5E 00 00 00 00 00 00 00 36 00 00 00 28 00 ; BM^.......6...(.
00000010h: 00 00 06 00 00 00 02 00 00 00 01 00 18 00 00 00 ; ................
00000020h: 00 00 28 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ..(.............
00000030h: 00 00 00 00 00 00 FF FA F5 FF FA F5 FF FA F5 FF ; ......
00000040h: FA F5 FF FA F5 FF FA F5 00 00 FF FB F6 FF FB F6 ; ..
00000050h: FF FB F6 FF FB F6 FF FB F6 FF FB F6 00 00       ; ..

6x3=18bytes
18+2=20bytes 每行补2个字节
20x2=40bytes=0x28bytes

FF FA F5 - FF FA F5 - FF FA F5 - FF FA F5 - FF FA F5 - FF FA F5 - 00 00 
FF FB F6 - FF FB F6 - FF FB F6 - FF FB F6 - FF FB F6 - FF FB F6 - 00 00

7x2 24色

00000000h: 42 4D 66 00 00 00 00 00 00 00 36 00 00 00 28 00 ; BMf.......6...(.
00000010h: 00 00 07 00 00 00 02 00 00 00 01 00 18 00 00 00 ; ................
00000020h: 00 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ..0.............
00000030h: 00 00 00 00 00 00 FF FA F5 FF FA F5 FF FA F5 FF ; ......
00000040h: FA F5 FF FA F5 FF FA F5 FF FA F5 00 00 00 FF FB ; ...?
00000050h: F6 FF FB F6 FF FB F6 FF FB F6 FF FB F6 FF FB F6 ; ?
00000060h: FF FB F6 00 00 00                               ; ...

7x3=21bytes
21+3=24bytes
24*2=48bytes=0x30bytes

FF FA F5 - FF FA F5 - FF FA F5 - FF FA F5 - FF FA F5 - FF FA F5 - FF FA F5 - 00 00 00 
FF FB F6 - FF FB F6 - FF FB F6 - FF FB F6 - FF FB F6 - FF FB F6 - FF FB F6 - 00 00 00
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C语言中,可以使用以下代码来实现BMP图像进行4字节对齐填充的操作: ```c #include <stdio.h> #include <stdlib.h> // 填充0数据直到n字节对齐 void alignTo4Bytes(FILE* file, int n) { int padding = (4 - (n % 4)) % 4; // 计算需要填充的字节数 // 填充0数据 for (int i = 0; i < padding; i++) { fputc(0, file); } } int main() { // 打开BMP文件 FILE* bitmapFile = fopen("input.bmp", "rb"); FILE* alignedFile = fopen("output.bmp", "wb"); // 读取BMP文件头 unsigned char header[54]; fread(header, sizeof(unsigned char), 54, bitmapFile); // 写入BMP文件头 fwrite(header, sizeof(unsigned char), 54, alignedFile); // 读取图像数据 int width = *(int*)&header[18]; int height = *(int*)&header[22]; int bitsPerPixel = *(int*)&header[28]; int rowSize = width * (bitsPerPixel / 8); // 每行的字节数 alignTo4Bytes(bitmapFile, rowSize); // 对齐填充 // 复制图像数据 unsigned char* buffer = (unsigned char*)malloc(rowSize); for (int i = 0; i < height; i++) { fread(buffer, sizeof(unsigned char), rowSize, bitmapFile); fwrite(buffer, sizeof(unsigned char), rowSize, alignedFile); alignTo4Bytes(alignedFile, rowSize); // 对齐填充 } // 关闭文件 fclose(bitmapFile); fclose(alignedFile); // 释放内存 free(buffer); return 0; } ``` 以上代码假设输入的BMP文件名为"input.bmp",输出的对齐后的BMP文件名为"output.bmp"。代码中的`alignTo4Bytes`函数用于填充0数据直到n字节对齐。在主函数中,首先读取BMP文件头信息并写入对齐后的文件,然后逐行读取图像数据并写入对齐后的文件,每行结束后都进行4字节对齐填充。 请注意,在使用此代码时,需要确保输入的BMP文件存在且是有效的24或32BMP图像。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值