ucgui 颜色管理—逻辑颜色与物理颜色

一、基本概念

ucgui 支持黑白,灰度和彩色 的显示。

1. 逻辑颜色

逻辑颜色是应用程序中处理的颜色。它是一个24bits 的RGB值,R 、G 、B 都是8bits ,格式如下:

0xBBGGRR

因此,白色 的值为0xFFFFFF, 黑色的值为 0x000000,深红的值为 0x0000FF。

2.物理颜色

物理颜色是真正写入到 LCD 控制器的颜色值。

3. 色彩深度

色彩深度表示存储每一个像素的颜色所用的位数,常用单位为位/像素(bpp)。色彩深度越深,可用的颜色就越多。

色彩深度是用 “n 位元颜色”(n-bit color) 来说明的。常见的有:

n 位元 颜色描述
1 位元 2种颜色,黑白二色
2 位元 4 级灰度
4 位元 16 级灰度
5 位元 32种颜色
8 位元 256 种颜色
16 位元 65536 种颜色
24 位元 16,777,216种颜色,真彩色,能提供比肉眼能识别更多的颜色,用于显示照片
32 位元 基于24位元而生,增加8个位元(256种)的透明通道,共4,294,967,296种颜色。

3. 为什么需要逻辑颜色与物理颜色

前面我们说到,ucgui 支持黑白、灰度 和彩色显示。也就是支持不同色彩深度的显示(最高24位)。为了简化编程,ucgui 在最上层使用逻辑颜色来处理,GUI 框架内部自动根据用户配置完成逻辑颜色到物理颜色的转换,最终写入lcd 驱动的是物理颜色。

二、相关的API

1. 逻辑颜色API

void GUI_SetBkColor( GUI_COLOR color )
{GUI_LOCK();{LCD_SetBkColor( color );} GUI_UNLOCK();
}void GUI_SetColor( GUI_COLOR color )
{GUI_LOCK();{LCD_SetColor( color );} GUI_UNLOCK();
}

2. 物理颜色

void LCD_SetColorIndex( int Index )
{LCD_ACOLORINDEX[_GetColorIndex( 1 )] = Index;
}void LCD_SetBkColorIndex( int Index )
{LCD_ACOLORINDEX[_GetColorIndex( 0 )] = Index;
}

3. 颜色转换

int LCD_Color2Index( LCD_COLOR Color )
{return LCDDEV_L0_Color2Index( Color );
}LCD_COLOR LCD_Index2Color( int Index )
{return LCDDEV_L0_Index2Color( Index );
}

三、我遇到的问题

1. 出现的问题

移植完ucgui 之后,分别设置背景颜色,字体颜色,输出一行 “HelloWorld!” 。结果是背景颜色,字体颜色的输出都跟预期不符合。

GUI_Init();
GUI_Clear();
GUI_SetBkColor( GUI_RED);
app_log( "bk color:%x\n", LCD_Color2Index ( GUI_RED) );
GUI_SetColor( GUI_GREEN);
app_log( "color:%x\n", LCD_Color2Index ( GUI_GREEN) );
GUI_DispString( "Helloworld!\n" );

2. 问题分析

用物理颜色API 代替逻辑颜色API,也即是用 LCD_SetBkColorIndex 代替 GUI_SetBkColor,用GUI_SetColor 代替 LCD_SetColorIndex,参数是rgb565 颜色的表示,屏幕输出的效果符合预期,说问题出在逻辑颜色转换成物理颜色这部分处理。

手动调用颜色转换函数,进行转换,如下:

app_log( "bk color:%x\n", LCD_Color2Index ( GUI_RED) );

发现转换出来的颜色值,的确不是RGB565 表示的红色。

3. 问题排查

跳转至LCD_Color2Index 的定义,发现最底层是通过COLOR2INDEX 这个宏实现颜色转换。

LCD_SWAP_RB 决定是调用 LCD_Color2Index_M565 还是 LCD_Color2Index_565。

查看LCD_Color2Index_M565 才发现:

  • LCD_SWAP_RB 为1 时,以RGB 的形式转换成物理颜色
  • LCD_SWAP_RB 为0 时,以BGR 的形式转换成物理颜色
LCD_FIXEDPALETTE == 565, 65536 colors, RRRRRGGGGGGBBBBB

这里,LCD_SWAP_RB 的定义,跟我理解的刚好相反。

4. 问题解决

在文件LCDConf.h 定义:

#define LCD_SWAP_RB (1)

ucgui 颜色管理—逻辑颜色与物理颜色相关推荐

  1. 计算机颜色管理器,系统颜色管理完全攻略

    什么是颜色管理? 颜色管理是一个系统,用于确保彩色内容在任何位置的呈现效果都让您满意,包括显示器和打印机等设备. 为什么需要颜色管理? 不同类型的设备往往会有不同的颜色特征和功能.例如,对于同一组颜色 ...

  2. 计算机颜色管理器,Windows7色彩管理显示器ICC设置方法

    腾讯视频/爱奇艺/优酷/外卖 充值4折起 自从使用Windows 7之后,发现Windows 7并不会自动调用校色后的显示器icc文件.甚至人工切换icc文件时,颜色竟然没跟着转换(这代表icc对应的 ...

  3. Dcat-Admin框架JS颜色管理--Dcat-Admin框架实战(十六)

    目录 一.颜色管理文件位置 二.介绍颜色函数 1.获取内置颜色代码 2.颜色淡化 小探究(JS加不加分号?) 3.深化颜色 小发现(深化/淡化其实是一个函数?) 4.颜色透明化 5.获取所有内置颜色 ...

  4. 计算机颜色管理器,电脑显示器颜色管理

    D.电脑显示器颜色管理: a.桌面鼠标右键选择屏幕分辨率,打开对话框,点击高级: b.点击颜色管理 c.点击下面红框里的颜色管理 d.选择高级,点击设备配置文件的下拉按钮,选择sRGB IEC6196 ...

  5. AEJoy —— 三分钟了解 AE 相关的颜色空间和颜色管理

    目标 了解色彩空间和色彩管理器 什么是颜色管理器 色彩管理器(又称 "色彩管理系统" 或 "色彩管理解决方案" )是一种改变图像和视频的色彩空间的应用程序. 在 ...

  6. 颜色管理出问题:windows照片查看器无法显示此图片 因为内存不足。

    颜色管理 windows照片查看器无法显示此图片,因为计算机上的可用内存可能不足解决方法 3.打开颜色管理窗口,点击"高级". windows照片查看器无法显示此图片,因为计算机上 ...

  7. vue吸管拾色器、利用canvas获取坐标点颜色、canvas获取坐标点颜色图片跨域、图片转base64、colorPicker

    vue吸管拾色器.利用canvas获取坐标点颜色.canvas获取坐标点颜色图片跨域.图片转base64.colorPicker 1.需求:表格中主颜色和次颜色是需要从缩略图上吸取颜色,然后渲染色块, ...

  8. python使用matplotlib可视化、使用rcParams参数调整可视化图像中线条宽度、线条类型、文本字体、字体大小、字体颜色、字体类型、文本颜色等

    python使用matplotlib可视化.使用rcParams参数调整可视化图像中线条宽度.线条类型.文本字体.字体大小.字体颜色.字体类型.文本颜色等 目录

  9. php设置背景为透明,css如何设置背景颜色透明?css设置背景颜色透明度的两种方法介绍...

    在网页布局中有时为了网页的整体美观,可能需要将网页中的某些部分设置为背景颜色透明,那么如何设置背景颜色透明呢?本篇文章就来给大家介绍一下css设置背景颜色透明的方法. 在css中设置背景颜色透明的方法 ...

最新文章

  1. Io流的字节流与缓冲流
  2. mysql 和 mongo db 语法对比
  3. 【Applet编写应用小程序】Applet类APIの基本知识和第一个程序
  4. 提高 DevTools 控制台调试 console 的 12 种方法
  5. springcloud gateway 使用nacos 作为配置中心 和 注册中心
  6. operator* operator- 操作符的使用
  7. supersr--图形上下文的注意点
  8. 二十三、Oracle学习笔记:综合案例
  9. 「本地搭建」worpress博客系统
  10. 第六天:对项目后端日志存储
  11. 微信APP支付 C#
  12. VARCHART XGantt 甘特图用程序应该如何交付
  13. ramdump crash工具
  14. 音乐彩灯控制器C语言程序,基于单片机的LED彩灯控制器
  15. 树莓派Python开发第8课: PWM实验
  16. 手机开热点但是电脑一直连接不上_电脑连不上wifi,手机可以连上。手机开热点,电脑可以连上。这是怎么回事,电脑就一直循环连接那个w...
  17. 给我5分钟,手把手带你学会定时任务!
  18. python timeit.timer_python之timeit模块
  19. android来电显示,在Android 9中获取来电显示
  20. 米哈游人工桌面YOYO鹿鸣

热门文章

  1. 顺序栈的基本操作 C++
  2. 【面试题系列】必须掌握的六大类型JS面试题
  3. 2021寒假MISC打卡DAY14
  4. 迪士尼的“元宇宙梦”醒了
  5. 遍历map集合的四种方法
  6. HW- Basic - 电容的分类、封装和标识
  7. 【C语言】实现通讯录(详解)
  8. ghost备份怎么分卷ghost.exe -split=2048
  9. 浙江省获部系统集成资质单位名录 (2009年11月23日更新)
  10. ubuntu22.04安装ros教程