学习目标:
(本次学习只是让我们有个大致的了解)
在GEC6818开发板上实现荷兰、法国国旗图案显示
了解ARM开发板图⽚显⽰原理
了解BMP图⽚在开发板显⽰时存在的问题(上)
学习内容:
在GEC6818开发板上实现荷兰、法国国旗图案显示
注意: 请在800*480的LCD屏幕上绘制
荷兰国旗
第0步:引入文件IO的相关库
第1步:打开fb0文件(设备文件)可读可写的方式(O_RDWR)open("/dev/fb0",O_RDWR);
观察:
左侧:
x:0~266 (含头不含尾)
y:0~480
ARGB:0x00002654
范围:第0~266*480
中间:
x:266~532 (含头不含尾)
y:0~480
ARGB:0x00ffffff
范围:第266~532*480
右侧:
x:532~800 (含头不含尾)
y:0~480
ARGB:0x00cd1125
范围:第532~800*480
第3步:定义缓冲区(便利贴)int buf[800*480];
将缓冲区的颜色数据写入fb0(LCD屏幕文件),write(lcd,buf,800*480*4);
第4步:关闭fb0,close(lcd);
法国国旗
第0步:引入文件IO的相关库
第1步:打开fb0文件可读可写的方式(O_RDWR)open("/dev/fb0",O_RDWR);
观察:
左侧:
x:0~266 (含头不含尾)
y:0~480
ARGB:0x00002654
范围:第0~266*480
中间:
x:266~532 (含头不含尾)
y:0~480
ARGB:0x00ffffff
范围:第266~532*480
右侧:
x:532~800 (含头不含尾)
y:0~480
ARGB:0x00cd1125
范围:第532~800*480
第3步:定义缓冲区(便利贴)int buf[800*480];
将缓冲区的颜色数据写入fb0(LCD屏幕文件),write(lcd,buf,800*480*4);
第4步:关闭fb0,close(lcd);
LCD液晶屏幕显示图片
常见的图片格式
JPEG/IPG:采用专用的图像压缩算法进行压缩。
BMP:它采用位映射格式存储,除了图像深度可选以外,不采用其他任何的压 缩。
好处:在显示和保存的时候不需要算法来进行压缩和解压
坏处:占用空间比较大(推荐24位)
了解BMP的基本特征
24位:BMP图片的数据是由:基本信息域(54个字节)
+ 数据域(像素点,由RGB构成)
也就是3个字节。
RGB:3个字节(R:红色,G:绿色,B:蓝色)
BMP每个像素点由3个字节构成,LCD屏幕的像素点由4个字节构成
思考:
① 如何将24位的图片显示到32位的LCD屏幕上?
答:增加灰度A,实现字节对齐。
②图片中的54个基本信息域(不是像素点)如何处理?
答:对前54给字节进行裁切,使用到的函数:lseek();
BMP:800 * 480 * 3 = 1152000字节(图像域)+54字节(信息域)约= 1.09MB
ARM开发板图⽚显⽰原理
首先需要准备一张800∗480的图片,用作测试。
思路:
第1步:打开fb0⽂件(只写⽅式),打开图⽚⽂件(读写⽅式),函数open()
第2步:将图⽚⽂件⾥⾯的像素点读取出来,放到缓冲区(800∗480∗3),函数read()
第3步:将缓冲区⾥⾯的像素点,写进fb0⽂件⾥,函数write()
第4步:关闭所有打开的⽂件,函数close()
请大家结合之前所学文件IO以及图形的绘制,实现图片的绘制,并观察绘制图片的效果。
根据思路,完成代码:
#include <stdio.h>
// 文件IO操作相关的四个库文件
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int main(int argc, char const *argv[])
{
// 打开LCD屏幕(写进去)
int lcd = open("/dev/fb0",O_RDWR);
// 打开BMP图片(读出来)
int bmp = open("./picture/home_bg.bmp",O_RDWR);
// 创建缓冲区,
int buf[800 * 480];
// 存放读取到的图片数据
int ret = read(bmp,buf,800 * 480 * 3); // BMP图片 1像素 = 3字节(GBR)
// 将缓冲区的图片数据写入到LCD屏
ret = write(lcd,buf,800 * 480 * 4); // LCD屏幕 1像素 = 4字节(ARGB)
// 关闭BMP图片
close(bmp);
// 关闭LCD屏幕
close(lcd);
return 0;
}
显示效果: 图片缺少4分之1,且字体、颜色、图片整体失真。
BMP图⽚在开发板显⽰时存在的问题
1. 只显示四分之三的问题
分析:
RGB:是由RGB三种色值构成,也就是1像素=3字节,也就是800*480的图片拥有的字节数为:
800 * 480 * 3 = 1152000 字节
LCD:是由ARGB四种色值构成,也就是1像素=4字节,也就是800*480的屏幕拥有的字节数为:
800 * 480 * 4 = 1536000 字节
也就是RGB只能占满LCD屏幕的四分之三。
改造前:
改造思路:
// 将一个BMP图片的像素点,对齐一个LCD屏幕的像素点
// 做法是再定义一个数组,来进行像素点的改造
int argb[800 * 480]; // 1个argb 对应一个lcd屏幕的像素点
char rgb[800 * 480 *3]; // 三个rgb 组成一个BMP图片的像素点
改造后:
2. 图片色调问题
解决方法:
注意:
- LCD:
像素点中字节排列顺序:ARGB
- BMP:
像素点中字节排列顺序:(A)GBR
解决方案:
处理BMP:
A补充的,位置不做调整
B位置不动
G向左移动⼀个字节,也就是8位 G << 8
R向左移动⼆个字节,也就是16位 R << 16
学习时间:
2024.11.08
标签:字节,入门,LCD,嵌入式,入土,BMP,800,像素点,480 From: https://blog.csdn.net/qq_48810255/article/details/143947908