如何使用ST7789展现图片?[ESP--4]
本节我们继续ESP和ST 7789的话题,这节课我们来学学如何展示图片,话不多说,先上效果
好,教程开始~前情提要,要看懂这篇,建议搭配楼主的前两期文章
使用ESP32驱动LCD-ST7789屏幕[ESP–2]
加速你的LCD-ST7789屏幕![ESP–3]
好,话不多说,直接开始
显示原理
ST7789支持的颜色为RGB565,一般我们常见的颜色是RGB888,就是RGB三色各占一个字节(一个字节8位),ST7789毕竟是MCU模块,自然要减轻负担,所以RGB阉割成了2字节能表示的(人眼对绿光最敏感,所以绿光的色阶更多)
然后如何在屏幕上放像素呢?
tft.drawPixel(x , y , 0xFFFF);
//封装好的函数,直接输入一个二字节数就行,多么简单
所以现在的问题就是怎么把图片转换为一个RGB565数组,然后导入我们的程序。这里我使用的是开源的格式转换工具BMPCVT
在网上和GITHUB上有这个软件
使用方法
- 点击FILE/OPEN 打开你需要转换的文件
、
选择IMAGE/CONVERT INTO /16BIT COLOR565
选择FILE/SAVE AS/进入下面的界面
选择C bitmap的格式,保存到你可见的位置
/
最后的加工
不过这个数组我们现在还不能直接使用,因为我们用的是eSPI 库,这个作者用的是GUI(?)
打开文件,你会看到这个画面
- 删除include 命令
- 删除数组的static 修饰符
- 删去结尾的那个结构体
- 将这个文件放到你的工程中去
- 如果可以,把后缀改成H,然后包含一下
下面就是代码了
#include <TFT_eSPI.h>
#include <SPI.h>#include "image_rgb565.cpp"
//包含你的数组class Timer {
public:Timer() : start_timepoint(std::chrono::high_resolution_clock::now()) {}void reset() {start_timepoint = std::chrono::high_resolution_clock::now();}double elapsed() const {auto end_timepoint = std::chrono::high_resolution_clock::now();std::chrono::duration<double> elapsed_time = end_timepoint - start_timepoint;return elapsed_time.count();}private:std::chrono::time_point<std::chrono::high_resolution_clock> start_timepoint;
};
Timer timer;TFT_eSPI tft = TFT_eSPI(); // 使用优化后的TFT_eSPI库void drawImage() {// 将图片数据绘制到 ST7789 上int16_t x = 0, y = 0; // 图像绘制起始位置for (int16_t j = 0; j < 240; j++) {for (int16_t i = 0; i < 240; i++) {uint16_t color = image_data[j * 240 + i];tft.drawPixel(x + i, y + j, color);}}
}void setup() {Serial.begin(9600);tft.init();tft.setRotation(1); // 设置旋转// 如果需要,可以明确调用长宽// 显示固定的文本,只在 setup 中显示一次tft.fillScreen(TFT_BLACK);Serial.printf("Total heap: %d ", ESP.getHeapSize()); // 获取总堆内存大小Serial.println();Serial.printf("Free heap: %d", ESP.getFreeHeap()); // 获取当前可用堆内存大小Serial.println();Serial.printf("Total PSRAM: %d", ESP.getPsramSize()); // 获取总PSRAM大小(如果支持)Serial.println();Serial.printf("Free PSRAM: %d", ESP.getFreePsram()); // 获取当前可用PSRAM大小(如果支持)Serial.println();
}void loop() {// 绘制动态变化的部分tft.fillRect(0, 0, 100, 50, TFT_BLACK); // 清除FPS部分drawImage();float FPS = 1 / (timer.elapsed());tft.setCursor(0, 0);tft.printf("FPS: %.2f", FPS);timer.reset();delay(50);}
相关文章:

如何使用ST7789展现图片?[ESP--4]
本节我们继续ESP和ST 7789的话题,这节课我们来学学如何展示图片,话不多说,先上效果 好,教程开始~前情提要,要看懂这篇,建议搭配楼主的前两期文章 使用ESP32驱动LCD-ST7789屏幕[ESP–2] 加速你的LCD-ST7789屏幕…...
【QNX+Android虚拟化方案】129 - USB眼图参数配置
【QNX+Android虚拟化方案】129 - USB眼图参数配置 1. 软件侧dts如何配置眼图参数 及 其对应关系2. 硬件 QNX 侧调试眼图命令2.1 High Speed USB2.0 Host2.2 Super Speed USB3.0 Host3. 硬件 Android 侧调试眼图命令基于原生纯净代码,自学总结 纯技术分享,不会也不敢涉项目、不…...

【机器学习】探索机器学习决策树算法的奥秘
决策树 前言基本概念常见的决策树算法ID3算法C4.5算法CART算法 决策树的优缺点应用场景决策树的可视化总结 前言 在当今这个数据驱动的时代,机器学习作为数据分析与预测的利器,正以前所未有的速度改变着我们的生活和工作方式。在众多机器学习算法中&…...

K8S版本和istio版本的对照关系
版本对照关系 下载地址1 下载地址2...

嵌入式硬件实战提升篇(三)商用量产电源设计方案 三路电源输入设计 电源管理 多输入供电自动管理 DCDC降压
引言:本文你能实际的了解到实战量产产品中电源架构设计的要求和过程,并且从实际实践出发搞懂电源架构系统,你也可以模仿此架构抄板到你自己的项目,并结合硬件篇之前的项目以及理论形成正真的三路电源输入设计与开发板电源架构块供…...
【机器学习】机器学习的基本分类-监督学习-逻辑回归-Sigmoid 函数
Sigmoid 函数是一种常用的激活函数,尤其在神经网络和逻辑回归中扮演重要角色。它将输入的实数映射到区间 (0, 1),形状类似于字母 "S"。 1. 定义与公式 Sigmoid 函数的公式为: 特点 输出范围:(0, 1),适合用…...

EasyDarwin搭建直播推流服务
学习链接 easydarwin官网 - 这里看介绍 easydarwin软件下载地址 - 百度网盘 easydarwin视频 B站 文章目录 学习链接使用下载EasyDarwin压缩包,并解压到目录启动EasyDarwin点播直播easyplayer.jsapidocffmpeg推流rtsp & ffplay拉流 使用 下载EasyDarwin压缩包…...

无人机数据处理系统:原理与核心系统
一、数据处理系统的运行原理 数据获取:无人机在飞行过程中,通过搭载的传感器(如相机、激光雷达等)采集到各种类型的数据,例如图像、点云等。这些数据是后续处理和分析的基础。 数据传输:采集到的数据会通…...

DLL中的inline static成员变量:Windows开发中的常见陷阱
在Windows平台进行C开发时,DLL(动态链接库)是一个非常重要的概念。它让我们能够实现代码的模块化和动态加载,提高了程序的灵活性和维护性。然而,当我们在DLL中使用C17引入的inline static成员变量时,可能会…...
pandas 读写excel
在Python中,使用Pandas库读写Excel文件是一个常见的操作。Pandas提供了read_excel和to_excel方法来分别实现读取和写入Excel文件的功能。以下是一些基本的示例: ### 读取Excel文件 python import pandas as pd # 读取Excel文件 df pd.read_excel(pat…...
记录Threadlocal使用
编写ThreadLocal工具类 package com.jjking.jplan.context;public class BaseContext<T> {public static final ThreadLocal threadLocal new ThreadLocal();//存储用户public static void set(Object t) {threadLocal.set(t);}//获取用户public static <T> T ge…...

2024 ccpc 辽宁省赛 E(构造 思维?)L(二分+一点点数论知识?)
E 题意: 可以注意到: 我的两种方格都四个方格的大小。 所以 如果存在一种摆放方式 那么 4|nm。 再考虑一种特殊的情况 22 ,此时虽然我的积是4 但是无法摆放的。 1>对于 4 | n,或者 4 | m.我直接摆放第二种方格就可以了。 如果我n 是4 的…...

【iOS】设计模式的六大原则
【iOS】设计模式的六大原则 文章目录 【iOS】设计模式的六大原则前言开闭原则——OCP单一职能原则——SRP里氏替换原则——LSP依赖倒置原则——DLP接口隔离原则——ISP迪米特法则——LoD小结 前言 笔者这段时间看了一下有关于设计模式的七大原则,下面代码示例均为OC…...
网络安全:攻防技术-Google Hacking的实现及应用
前言 google hacking其实并算不上什么新东西,在早几年我在一些国外站点上就看见过相关的介绍,但是由于当时并没有重视这种技术,认为最多就只是用来找找未改名的mdb或者别人留下的webshell什么的,并无太大实际用途。但是前段时间仔…...
输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。-多语言
目录 C 语言实现 Python 实现 Java 实现 Js 实现 Ts 实现 题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。 程序分析:利用while语句,条件为输入的字符不为\n。 C 语言实现 #include <stdio.h>int mai…...

2-2-18-9 QNX系统架构之文件系统(三)
阅读前言 本文以QNX系统官方的文档英文原版资料为参考,翻译和逐句校对后,对QNX操作系统的相关概念进行了深度整理,旨在帮助想要了解QNX的读者及开发者可以快速阅读,而不必查看晦涩难懂的英文原文,这些文章将会作为一个…...
各大浏览器(如Chrome、Firefox、Edge、Safari)的对比
浏览器如Chrome、Firefox、Edge等在功能、性能、隐私保护等方面各有特点。以下是对这些浏览器的详细对比,帮助你选择合适的浏览器。 1. Google Chrome 市场份额:Chrome是目前市场上最流行的浏览器,约占全球浏览器市场的65%以上。 性能&#…...
nginx搭建直播推流服务
文章目录 学习链接步骤使用nginx搭建直播推流服务安装依赖库下载nginx-http-flv-module模块下载nginx解压nginx,进入nginx目录设置nginx编译配置编译并安装配置nginx rtmp服务启动nginx 准备另外一台电脑下载OBS下载OBS windows | linux 安装vlc观看直播flv协议hls协…...

单片机-- 松瀚sonix学习过程
硬件:松瀚sn8f5701sg、SN-LINK 3 Adapter模拟器、sn-link转接板 软件: keil-c51(v9.60):建立工程,编辑,烧录程序 SN-Link_Driver for Keil C51_V3.00.005:安装sonix设备包和snlin…...

循环神经网络:从基础到应用的深度解析
🍛循环神经网络(RNN)概述 循环神经网络(Recurrent Neural Network, RNN)是一种能够处理时序数据或序列数据的深度学习模型。不同于传统的前馈神经网络,RNN具有内存单元,能够捕捉序列中前后信息…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...

3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...

【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...
重启Eureka集群中的节点,对已经注册的服务有什么影响
先看答案,如果正确地操作,重启Eureka集群中的节点,对已经注册的服务影响非常小,甚至可以做到无感知。 但如果操作不当,可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...

初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...

人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...