嵌入式图形库 —— embedded-graphics
嵌入式图形库(embedded-graphics)是一个专为资源受限的嵌入式设备设计的2D图形库。它的核心目标是在不使用任何缓冲区的情况下绘制图形,兼容no_std
环境,并且在没有动态内存分配器或大量预分配内存的情况下也能正常工作。通过迭代器的方式来实现像素颜色和位置的实时计算,使得应用程序能够以极小的RAM占用实现图形绘制。
该库包含了丰富的内置元素,可以轻松地画出各种2D图形:
- 原始数据图像
- 基本形状
- 线条
- 矩形(包括正方形)
- 圆形
- 椭圆
- 弧形
- 扇形
- 三角形
- 多边形
- 圆角矩形
- 文本
- 等宽字体
外部扩展功能
为了增强功能,embedded-graphics设计成可由应用或其它库进行扩展。例如,支持不同的图像格式或自定义字体:
- BMP图像 - tinybmp
- TGA图像 - tinytga
- QOI图像 - tinyqoi
- 大量字体集 - u8g2-fonts
- ProFont等宽字体 - profont
- Pico8的Picofont - embedded-picofont
- IBM437字体 - ibm437
- 从embedded-graphics 0.6版携带的字体 - embedded-vintage-fonts
- 布局和对齐工具 - embedded-layout
- 具有对齐选项的文本框 - embedded-text
- 小型嵌入式目标的堆无绘图库 - embedded-plots
- 虚拟七段显示器 - eg-seven-segment
- 绘图前的画布 - embedded-canvas
- 帧率计数器 - embedded-fps
- 带DMA支持的帧缓冲区 - embedded-graphics-framebuf
请注意,这些库中的一些可能不支持embedded-graphics的最新版本。
如果您知道尚未在此列表中的库,请开一个问题添加它。
显示驱动程序
为了支持各种不同的显示设备,embedded-graphics直接不包含任何驱动程序,而是提供了一个在embedded-graphics-core
中的DrawTarget
API,外部库可以实现这个API。此外,还有一个模拟器,可以在开发过程中用于测试代码。
显示硬件的照片展示了embedded-graphics在实际显示屏上运行的效果。
目前社区已经为以下一些显示屏增加了embedded-graphics支持。这个列表来自crates.io上的依赖项列表,因此可能遗漏了一些未发布的条目。如果发现有应被加入到列表的显示驱动,请开启一个问题。
- embedded-graphics-web-simulator:浏览器内的WebAssembly模拟显示
- epd-waveshare:Waveshare的多种电子纸(EPD)显示驱动
- hub75:RGB矩阵显示屏的hub75驱动
- ili9341:平台无关的 ili9341 (和 ili9340c) TFT LCD 屏幕驱动
- ls010b7dh01:LS010B7DH01 内存LCD显示屏驱动
- push2_display:Ableton Push2的嵌入式图形显示屏驱动
- sh1106:SH1106 OLED显示屏的I2C驱动
- sh1108:SH1108 OLED显示屏的I2C/SPI驱动
- smart-leds-matrix:基于ws2812等智能LED的LED矩阵驱动
- ssd1306:SSD1306 OLED显示屏的I2C和SPI(四线)驱动
- ssd1309:SSD1309 OLED显示屏的I2C/SPI驱动
- ssd1322:SSD1322 OLED显示屏驱动
- ssd1331:SSD1331 OLED显示屏的SPI(四线)驱动
- ssd1351:SSD1351驱动
- ssd1675:Solomon Systech SSD1675 e-Paper显示(EPD)控制器的Rust驱动
- st7565:ST7565显示屏的SPI驱动
- st7735-lcd:使用ST7735驱动器的显示屏库
- st7789:ST7789显示驱动库
- st7920:ST7920 LCD驱动
模拟器
embedded-graphics自带一个[模拟器]!模拟器可用于测试和调试嵌入式图形代码,或者创建示例和交互式演示来展示embedded-graphics的功能。
查看示例仓库来看看embedded-graphics能做什么,以及它在显示屏上的效果。你可以像这样运行示例:
git clone https://github.com/embedded-graphics/examples.git
cd examples/eg-0.7
cargo run --example hello-world
功能配置
可以通过在Cargo.toml
中添加以下特性启用额外功能:
nalgebra_support
- 使用带有no_std
支持的Nalgebra库,允许从nalgebra::Vector2
转换到Point
和Size
。fixed_point
- 使用固定点算术代替浮点数进行所有三角函数计算。defmt
- 提供适用于所有可能类型的defmt::Format
实现。defmt
是一个特别适合低资源MCU的日志库。请注意,defmt
可能与不支持defmt
的旧版rustc一起使用时不起作用,而embedded-graphics
本身是支持的。
从旧版本迁移
实现embedded_graphics
支持的显示驱动
要向显示驱动添加对embedded-graphics的支持,需要在embedded-graphics-core
中实现DrawTarget
。这将使所有的embedded-graphics元素都可以由显示驱动渲染。查看DrawTarget
文档了解实现详情。
示例
绘制示例
下面的示例展示了使用embedded-graphics在Framebuffer
(代替真实目标硬件)上绘制的各种形状和文本。也可以使用模拟器进行调试、开发或在没有硬件的情况下操作。
形状和文本
以下示例绘制了几个形状和文本到一个FrameBuffer
。当硬件不可用时,还可以使用模拟器。
// 示例代码
通过embedded-graphics,开发者可以轻松地在嵌入式系统上实现复杂的图形和文本操作,而无需担心资源限制。其独特的内存管理方式、丰富的图形库以及广泛的硬件支持使其成为嵌入式编程的理想选择。无论您在制作工业设备界面、游戏机还是物联网设备,embedded-graphics都能助您一臂之力,让您的产品更具视觉吸引力。