U8G2 显示位图

任务目标:

在SSD1306显示一张16x16像素的图标,如下图:
在这里插入图片描述
图片明显大于16x16,需要将图片缩放到16x16并显示在LCD屏幕上。
目标屏幕参数如下:
在这里插入图片描述
width:128pix
height:32pix

需要两个工具:

1.Image2LCD
2.PctoLCD

PctoLCD可以编辑一张位图的每个像素点,如果手绘能力够强,可以自己用PctoLCD画像素画来制作位图。也可以打开一张现有的位图,编辑它的每个像素点,让最后的显示效果更接近自己的要求。
在这里插入图片描述

Image2LCD可以直接把一张图转换成适合LCD显示的图片或者C语言数组。
在这里插入图片描述
因为Image2LCD可以直接将图片缩放并转成C语言数组,所以一开始就用它直接转成数组放进程序来显示,结果发现显示出来的图片出现很多脏点。同时还伴随一些像素点的缺失。如下图所示:
在这里插入图片描述

在这里插入图片描述

所以需要用image2LCD将图片存为BMP图片文件。再用PctoLCD编辑这张BMP图片。为什么不用Photoshop直接保存成BMP图片?因为用ps缩放保存后的位图是这样的。。。
在这里插入图片描述
已经完全看不出来图片原有的样子了。

继续说正确的方法。

在这里插入图片描述
用Image2LCD打开图片后修改参数,参数值参考红圈内的数据。最后保存成一张位图文件。

再用PctoLCD打开上一步保存的位图文件。如图:
在这里插入图片描述
这时看到的像素点仍有位置不对的。需要手动调整一下。
鼠标左键点一下对应像素点可以增加一个显示点。
右键点击可以去除一个像素点。
根据原图对这个图片手动做些调整如下:
在这里插入图片描述
然后生成字模:
生成字模参数如下:
在这里插入图片描述
确定之后会下下方显示字节数组:
在这里插入图片描述
将这些数值复制下来,粘贴到自己的程序里。刷机运行即可得到显示效果。

在这里插入图片描述

生成的数组里最后的这截不能要!
在这里插入图片描述
程序中和显示位图相关的代码:
u8g2.drawXBMP(2, 2, 16, 16, gImage_123);
gImage_123是生成的图片数组名。

最后放上最终显示效果:
在这里插入图片描述

附上两个软件的下载地址:

pctolcd:
链接:https://pan.baidu.com/s/13toXSYkKidi86hpd8ttQ1A
提取码:1234

image2lcd:
链接:https://pan.baidu.com/s/15g40kGk7YG3hOJ0kSDTyIQ
提取码:1234

### 使用U8G2库在STM32上显示图片 为了实现这一目标,需先完成一系列配置工作。确保已按照说明将U8g2库成功添加到Keil项目中[^2]。 #### 配置硬件接口 对于采用I2C通信方式连接的OLED屏幕而言,初始化设置至关重要。函数`u8g2_Setup_ssd1306_i2c_128x64_noname_f()`用于指定具体的显示屏型号以及数据传输模式;而`uint8_t *u8g2_m_16_8_f`则负责处理内部缓存分配逻辑,这部分代码位于`u8g2_d_memory.c`文件内[^3]。 ```cpp // 初始化U8G2对象并配置I2C参数 U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE, /* clock=*/ SCL_GPIO_Port, SCL_Pin, /* data=*/ SDA_GPIO_Port, SDA_Pin); ``` #### 加载位图图像资源 要让STM32能够展示特定图案,则需要准备相应的位图(BMP)格式文件,并将其转换成适合嵌入式系统的数组形式。可以借助在线工具或编写脚本自动完成此过程。下面是一个简单的例子: 假设有一个名为`logo.bmp`的小图标,经过转化后得到一个名为`logo_data[]`的一维字节数组表示该图像的数据流。 ```cpp const unsigned char logo_data[] PROGMEM = { 0xFF, 0xFF, ... , // 图像像素值序列化后的十六进制数 }; ``` 注意:实际应用时应根据具体需求调整图像大小及颜色深度,以适应所使用的OLED屏分辨率和性能限制。 #### 编写绘图程序片段 最后一步就是调用U8G2提供的API来绘制上述定义好的静态图形元素。这里给出一段完整的示例代码,展示了如何读取预编译的位图数据并在屏幕上渲染出来。 ```cpp #include "u8g2.h" extern const unsigned char logo_data[]; int main(void){ // 系统启动前准备工作... u8g2.begin(); while (true) { u8g2.clearBuffer(); // 清除缓冲区 // 设置画笔颜色为白色,默认背景色为黑色 u8g2.setFont(u8g2_font_ncenB08_tr); // 可选字体样式设定 u8g2.drawStr(0, 10, "Hello OLED!"); // 绘制字符串测试 // 显示加载的位图图像 u8g2.drawBitmapP(0, 0, LOGO_WIDTH, LOGO_HEIGHT, logo_data); u8g2.sendBuffer(); // 将更改同步到物理显示器 HAL_Delay(1000); // 延迟一秒刷新一次画面 } } ``` 以上即是在STM32平台上通过U8G2库驱动OLED模块显示自定义图片的方法概述[^1]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值