GEC6818的bmp图片显示

您所在的位置:网站首页 6818开发板音视频播放器 GEC6818的bmp图片显示

GEC6818的bmp图片显示

2023-11-14 09:44| 来源: 网络整理| 查看: 265

1、bmp概念

bitmap(位图)

.bmp图片与其它图片的区别 jpg/jpeg/png:这些图片都是经过数据压缩后的图片;如果直接读取,并不是图片的原始数据; 必须要先解压再读取。文件较小。 bmp:不采用任何压缩,存储的是图片原始数据;可以直接读取。文件较大。

大小(byte):800*480*3 + 54 = 1152000 + 54 = 1152054

说明:都出来的54个字节是bmp图片的头文件(包含图片的大小,格式等等)

bmp图片一个像素点的大小     24bit(3个字节) 说明:lcd一个像素点的大小是32bit(4个字节)

bmp图片一个像素点的组成方式 LCD:ARGB BMP:RGB(少了一个透明度)

BMP文件开头部分是BMP格式头,里面存放了RGB数据的尺寸、分辨率、色深等重要信息。BMP格式头中包含了如下三个结构体:

bitmap_header(必有)bitmap_info(必有)rgb_quad(可选,一般没有)

 

struct bitmap_header { int16_t type; int32_t size; // 图像文件大小 int16_t reserved1; int16_t reserved2; int32_t offbits; // bmp图像数据偏移量 }__attribute__((packed)); struct bitmap_info { int32_t size; // 本结构大小 int32_t width; // 图像宽 int32_t height; // 图像高 int16_t planes; int16_t bit_count; // 色深 int32_t compression; int32_t size_img; // bmp数据大小,必须是4的整数倍 int32_t X_pel; int32_t Y_pel; int32_t clrused; int32_t clrImportant; }__attribute__((packed)); // 以下结构体不一定存在于BMP文件中,除非: // bitmap_info.compression为真 struct rgb_quad { int8_t blue; int8_t green; int8_t red; int8_t reserved; }__attribute__((packed)); 2、特殊规则

a. 4字节倍数行距 BMP图片文件的一个重要规则是,每行数据字节数必须是4的倍数,假设某BMP图片的分辨率是 65 × 200,也就是说宽是 65 像素,假设每个字节色深是24bits(即3字节),那么这张图片一行的实际数据量是 65×3=195个字节,但195不是4的倍数,因此在每一行的末尾都会添加一个无效字节,将行距尺寸补到196个字节。

处理的原则很简单,首先根据具体图片的尺寸和色深等信息,计算出一行中会出现的无效字节的个数(0-3个字节),计算公式参考:

int pad = ((4-( width * bpp/8 ) % 4)) % 4; pad是最终计算得出的每一行的无效字节数,范围是0-3之间width是图片的宽bpp是图片的色深

在处理图像数据的时候,直接跳过这些无效字节就好了。

b. 上下颠倒 BMP图片中的RGB数据是上下颠倒的,因此文件数据中的最后一行是图像的最上面第一行。需要注意的是,上下是颠倒的,但是左右是正常的,因此在处理数据的时候不能从最后一个字节开始,而是从最末一行的首字节开始。

3、bmp图片读取步骤

1、打开lcd fd_lcd=open("/dev/fb0",O_RDWR);

2、内存映射 int* addr = mmap(NULL,大小,读写权限,分享权限,文件描述符,0);

3、打开bmp图读取数据 fd_bmp=open("bmp_name",O_RDWR);

4、跳过bmp图的头节点lseek(fd_bmp,54,SEEK_SET);

5、读取bmp的图片有效数据 char buf[800*480*3],read(fd_bmp,buf,800*480*3)

6、数据读取 *(addr+(479-y)*800+x) = buf[(y*800+x)*3+0] //B | (buf[(y*800+x)*3+1]



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3