首先了解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