1. 引言
此需求由某客户提出,需要用指定颜色的色阶替换原始位图的颜色来显示彩色位图。
2. 操作方法
STM32U59 系列单片机集成的 GPU2D 外设具有将彩色(RGB24)转换为纯亮度格式(L8),以及将原始 Alpha 信息(A8)配合指定颜色(RGB24)重新生成彩色(RGB24)的功能。我们可以先将原始位图像素彩色信息转换为 L8 格式存入临时缓冲,再利用 GPU2D 将此临时缓冲数据按照 A8 像素格式,配合指定的颜色进行渲染生成色阶,实现原始位图像素从彩色到色阶的转换。
2.1. 将原始位图(RGB24)转换为 L8
// 创建 L8 格式缓冲区
unsigned char convertBuffer[RESX*RESY] = {0}
// 绑定目标缓冲区
nema_bind_dst_tex((uintptr_t)convertBuffer, RESX, RESY, NEMA_L8, -1)
// 设置 blend 模式
nema_set_blend_blit(NEMA_BL_SRC)
// 绑定源缓冲区(原始位图)
nema_bind_src_tex((uintptr_t)source, RESX, RESY, NEMA_BGR24, -1,
NEMA_FILTER_BL)
// 开始渲染
nema_blit(0, 0)
下图为原始位图,上述操作生成的右图只保留亮度信息(L8)
2.2. 指定颜色并按照 A8 格式再次渲染为灰阶
// 设置渲染模式为 NEMA_BLOP_MODULATE_A
nema_set_blend_blit(NEMA_BL_SIMPLE | NEMA_BLOP_MODULATE_A)
// 指定目标颜色 ALPHA 值
nema_set_const_color(nema_rgba(0x00, 0x00, 0x00, 0xFF))
// 指定目标颜色 RGB
nema_set_tex_color(nema_rgba(0x00, 0xFF, 0x00, 0x00))
// 按照 A8 解析上一步获得的 L8 缓冲
nema_bind_src_tex((uintptr_t)convertBuffer, RESX, RESY, NEMA_A8, -1,
NEMA_FILTER_BL | NEMA_TEX_BORDER)
// 开始渲染
nema_blit(0, 0)
下图由左图的 Alpha 信息配合指定的颜色生成,可以指定任意颜色
完整代码请参考附件工程。
3. 小结
本文介绍了一种基于 STM32 GPU2D 外设的色彩格式转换功能,通过它来实现在屏幕上按灰阶(黑白、或其他指定颜色)显示彩色位图的方法,供有需要的 STM32 用户参考。
文档中所用到的工具及版本
IAR v8.50.6
NeoChromSDK_V1.0.1
STM32CubeU5_V1.2.0RC4
LAT 中的附件
LAT 用色阶来显示彩色位图_v0.1.7z
本文档参考ST官方的《【应用笔记】LAT1291+用色阶来显示彩色位图(PDF)》文档。
参考下载地址:https://download.csdn.net/download/u014319604/89006270