BMP24位图因为字节不对齐而显示倾斜的问题

首先了解BMP
bmp文件格式是windows环境中交换图数据的标准。无压缩故占用空间大,图像深度1/4/8/24bit,位映射存储,存储数据时图像的扫描从左到右从下到上的顺序。24位bmp存储是按BGR存的
具体说是这样,假设现在有一张图,宽6个像素,高随便,24位格式保存(每个像素点占三个字节,分别代表RGB三颜色)
那么它每行有效数据部分应该是6×3=18字节,18不是4的倍数,所以要补齐,补到20字节。最终存储格式如下图:

前18位为有效像素数据,最后两位XX为填补数据,无意义
BGR BGR BGR BGR BGR BGR XX
BGR BGR BGR BGR BGR BGR XX
BGR BGR BGR BGR BGR BGR XX
……

在图像显示时,填充的数据是不会显示出来的。
但是我们在对图像进行处理时,要注意跳过这些无效的填充数据。

当行数据不能被4整除时,会出现图片倾斜的问题,例如一张750*450的bmp图片,每一行的像素应该占750x3 = 2250字节,但2250不能被4整除,所以系统会自动在每一行后面补齐2个字节数据,达到2252字节,这样图片的长就被拉长了,就会出现倾斜现象。
所以为了解决这个问题,我们应该判断图片的行数据字节是否能被4整除,如果不行,我们将系统补齐的多余的字节剔除掉
对于24位bmp图,每个像素占3个字节,读到每行末尾换行读取时,需要跳过补齐的字节
实例代码:

//y:竖,x横;定y增X满X换行Y加				480*272
  void LCD_Fill_Pic_mirscan(u16 x, u16 y,u16 pic_W, u16 pic_H, u8* pic)
  {
  u32 i,j,offset=0,Ystart=0,k=0;
	Ystart = XSIZE_PHYS*y;

	if(0==(pic_W*3)%4)
	{
		offset=0;			
	}
	else
	{		
		offset=4-(pic_W*3)%4;
	}
	for(i=0;i<pic_H;i++)										
	{
		k=(pic_H-i-1)*pic_W*3+(pic_H-i-1)*offset;
		for(j=0;j<pic_W;j++)
		{	
			LTDC_Buf[x+j+XSIZE_PHYS*i+Ystart]=(pic[k+2]<<16)|(pic[k+1]<<8)|(pic[k]);
			k=k+3;	    
		}
	}
#endif	
}

引用:
https://blog.csdn.net/qq_41281869/article/details/100895129
https://blog.csdn.net/zzstack/article/details/48245551

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要读取BMP文件的位图数据,你可以按照以下步骤进行操作: 1. 打开BMP文件:使用合适的文件读取函数,如`fopen`来打开BMP文件,并确保成功打开文件。 2. 解析BMP文件头:BMP文件的前14个字节是文件头,其中包含了一些关于图像的基本信息,如文件类型、文件大小等。你可以使用结构体来解析文件头数据,例如: ```c typedef struct { unsigned short type; // 文件类型 unsigned int size; // 文件大小 unsigned short reserved1; // 保留字段 unsigned short reserved2; // 保留字段 unsigned int offset; // 数据偏移量 } BMPHeader; ``` 使用`fread`函数将文件头数据读取到这个结构体中。 3. 解析BMP信息头:紧接着文件头后面的40个字节BMP信息头,包含了图像的宽度、高度、位深度等信息。同样使用结构体来解析这部分数据,例如: ```c typedef struct { unsigned int size; // 信息头大小 int width; // 图像宽度 int height; // 图像高度 unsigned short planes; // 颜色平面数 unsigned short bitCount; // 每个像素的位数 unsigned int compression; // 压缩类型 unsigned int imageSize; // 图像数据大小 int xPixelsPerMeter; // 水平分辨率 int yPixelsPerMeter; // 垂直分辨率 unsigned int colorsUsed; // 使用的颜色数 unsigned int colorsImportant; // 重要颜色数 } BMPInfoHeader; ``` 同样使用`fread`函数将信息头数据读取到这个结构体中。 4. 解析位图数据:位图数据紧跟在信息头之后,根据位深度的不同,数据解析方式也会有所不同。对于常见的24位真彩色图像,每个像素由红、绿、蓝三个通道组成,每个通道占用一个字节,按照从左到右、从上到下的顺序排列。你可以使用一个二维数组来存储图像的像素数据,例如: ```c unsigned char** imageData = (unsigned char**)malloc(sizeof(unsigned char*) * height); for (int i = 0; i < height; i++) { imageData[i] = (unsigned char*)malloc(sizeof(unsigned char) * width * 3); fread(imageData[i], sizeof(unsigned char), width * 3, file); } ``` 注意,这里假设图像的宽度是4的倍数,如果不是,需要对每行的像素数据进行对齐处理。 5. 关闭文件:读取完位图数据后,记得关闭文件,释放内存。 以上是读取BMP文件位图数据的基本步骤,你可以根据需要进行进一步处理和操作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值