首页 > 其他分享 >嵌入式从入门到入土

嵌入式从入门到入土

时间:2024-11-22 14:47:09浏览次数:3  
标签:字节 入门 LCD 嵌入式 入土 BMP 800 像素点 480

学习目标:

(本次学习只是让我们有个大致的了解)
在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. 图片色调问题
解决方法:
在这里插入图片描述
注意:

  1. LCD:像素点中字节排列顺序:ARGB
  2. 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

相关文章

  • Ansible快速入门
    Ansible快速入门一、介绍Ansible是一款简单的运维自动化工具,只需要使用ssh协议连接就可以来进行系统管理,自动化执行命令,部署等任务。Ansible的特点1、ansible不需要单独安装客户端,也不需要启动任何服务2、ansible是python中的一套完整的自动化执行任务模块3、ansibleplaybo......
  • 飞凌嵌入式T113-i开发板RISC-V核的实时应用方案
    随着市场对嵌入式设备的功能需求越来越高,集成了嵌入式处理器和实时处理器的主控方案日益增多,以便更好地平衡性能与效率——实时核负责高实时性任务,A核处理复杂任务,两核间需实时交换数据。然而在数据传输方面,传统串行接口尽管成本较低,但其传输速率相对较慢;反之,并行接口虽然传输......
  • MISC从入门到放弃
    右侧有目录导航[BUUCTF]RSA分析得到一段文字:在一次RSA密钥对生成中,假设p=473398607161,q=4511491,e=17求解出d作为flga提交解题第一想法是python脚本,网上找到一个importgmpy2p=473398607161q=4511491e=17d=int(gmpy2.invert(e,(p-1)*(q-1)))print(d)得到fl......
  • (长期更新)《零基础入门 ArcGIS(ArcMap) 》实验一(上)----空间数据的编辑与处理(超超超详细
    老规矩,点赞+收藏+长评+关注!!!需要实验数据的直接划到博客最底端。目录ArcMap介绍概念操作地图操作地图浏览分析显示结果定制编程ArcMap下载ArcMap实验--空间数据的编辑与处理1.1实验内容及目的1.1.1实验内容1.1.2实验目的1.2实验方案1.3操作流程1.3.1环境设......
  • 20241122电路板维修入门之集成块焊接篇
    在没有热风焊台的情况下,也可考虑用烙铁配合焊锡来拆除或焊接集成块,它的方法是用烙铁在芯片的各个引脚都堆满焊锡,然后用烙铁循环把焊锡加热,直到所有的引脚焊锡都同时熔化,就可以把芯片取下来了。把芯片从电路板上取下来,可以考虑用细铜丝从芯片的引脚下穿过,然后从上面用手提起。......
  • 20241121电路板维修入门之CPU断针焊接篇
    CPU断针的情况很常见,370结构的赛扬一代CPU和P4的CPU针的根部比较结实,断针一般都是从中间折断,比较容易焊接,只要在针和焊盘相对应的地方涂上焊膏,上了焊锡后用烙铁加热就可以焊上了,对于位置特殊,不便用烙铁的情况可以用热风焊台加热。赛扬二代的CPU的针受外力太大时往往连根拔起,且......
  • C语言_入门例题_PAGE1
    入门例题在屏幕上输入一行信息#include<stdio.h>intmain() { printf("ThisisaCprogram.\n"); return0; }求两个整数之和#include<stdio.h>intmain() { inta,b,sum; a=123; b=456; sum=a+b; printf("sumis%d\n",sum);//%d是指定输......
  • 入门RTOS第七篇(队列函数)
    1.使用队列的流程:创建队列,写队列,读队列,删除队列2.创建队列有两种方法:动态分配内存、静态分配内存函数原型如下:QueueHandle_txQueueCreate(UBaseType_tuxQueueLength,UBaseType_tuxItemSize);静态分配内存:xQueueCreateStatic,队列的内存要事先分配好函数原型如下:Qu......
  • 运维怎么转行网络安全?零基础入门到精通,收藏这一篇就够了
    经常有人问我:干网工、干运维多年遇瓶颈,想学点新技术给自己涨涨“身价”,应该怎么选择?聪明人早已经用脚投票:近年来,越来越多运维的朋友寻找新的职业发展机会,将目光聚焦到了网络安全产业。1、为什么我建议你学习网络安全?有一种技术人才:华为阿里平安等大厂抢着要,甚至高薪难求......
  • 多线程编程入门Thread_Task_async_await简单秒懂
    `usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Threading;usingSystem.Threading.Tasks;usingSystem.Windows.Forms;namespace多线程编......