c语言显示bmp图片怎么对齐,BMP图像四字节对齐的问题

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

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

3、代码说明如下:

int     WidthBytes(   int   nBits,   int   nWidth   )

{//nBits为色彩位数,   nWidth为每行象素个数

int   nWidthBytes;//每行象素的数据长度

nWidthBytes   =   nWidth;

if(   nBits   ==   1   )   nWidthBytes   =   (   nWidth   +   7   )   /   8;

else   if(   nBits   ==   4   )   nWidthBytes   =   (   nWidth   +   1   )   /   2;      /*竟然没有8位的。256色不是很常见吗?!*/

else   if(   nBits   ==   16   )   nWidthBytes   =   nWidth   *   2;

else   if(   nBits   ==   24   )   nWidthBytes   =   nWidth   *   3;//24位真彩色

else   if(   nBits   ==   32   )   nWidthBytes   =   nWidth   *   4;//32位真彩色

//*******四字节对齐*******

while(   (   nWidthBytes   &   3   )   !=   0   )   nWidthBytes++;

//*******四字节对齐*******

return(   nWidthBytes   );

}

--------------------------------------------------------------------------------------------------------------------------

我的理解:

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

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

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

eg:Width=1(位图的宽度为1像素) BitCount=24(24位的像素位数。1个像素24位即3字节)

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

(3+3)/4  这是求出“基数”,为1.  如果没有加上3的话,商为0,明显不符合题意。

1*4得出LineBytes=4.

同理,如果是以位为单位,就是加上31.   Width*BitCount+31

then: (Width*BitCount+31)/32  *4

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然可以!这里是用C语言显示bmp图像代码示例: ``` #include <stdio.h> #include <stdlib.h> #pragma pack(push, 1) // 禁用内存对齐 typedef struct { char type[2]; int size; int reserved; int offset; int header_size; int width; int height; short planes; short bits_per_pixel; int compression; int image_size; int x_pixels_per_meter; int y_pixels_per_meter; int num_colors; int important_colors; } BMP_HEADER; #pragma pack(pop) // 恢复内存对齐 int main(int argc, char *argv[]) { if (argc != 2) { printf("Usage: %s filename\n", argv[0]); return 1; } FILE *fp = fopen(argv[1], "rb"); if (!fp) { printf("Failed to open file: %s\n", argv[1]); return 1; } BMP_HEADER h; fread(&h, sizeof(h), 1, fp); if (h.type[0] != 'B' || h.type[1] != 'M') { printf("Not a BMP file!\n"); return 1; } if (h.bits_per_pixel != 24) { printf("Only support 24-bit BMP files!\n"); return 1; } fseek(fp, h.offset, SEEK_SET); unsigned char *data = malloc(h.image_size); fread(data, h.image_size, 1, fp); fclose(fp); for (int y = h.height - 1; y >= 0; y--) { for (int x = 0; x < h.width; x++) { int i = (y * h.width + x) * 3; unsigned char b = data[i]; unsigned char g = data[i + 1]; unsigned char r = data[i + 2]; printf("\x1b[48;2;%d;%d;%dm ", r, g, b); // 使用 ANSI Escape Code 显示像素 } printf("\x1b[0m\n"); // 恢复控制台颜色 } free(data); return 0; } ``` 这个程序使用 ANSI Escape Code 在控制台窗口中显示bmp图像,支持24位真彩色格式的bmp文件。只需要将文件名作为程序的唯一命令参数即可运,例如: ``` $ ./bitmap_viewer image.bmp ``` 当然,你也可以将这个程序的源代码适当修改,以便在GUI应用程序中显示bmp图像

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值