ucgui 颜色管理—逻辑颜色与物理颜色
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 颜色管理—逻辑颜色与物理颜色相关推荐
- 计算机颜色管理器,系统颜色管理完全攻略
什么是颜色管理? 颜色管理是一个系统,用于确保彩色内容在任何位置的呈现效果都让您满意,包括显示器和打印机等设备. 为什么需要颜色管理? 不同类型的设备往往会有不同的颜色特征和功能.例如,对于同一组颜色 ...
- 计算机颜色管理器,Windows7色彩管理显示器ICC设置方法
腾讯视频/爱奇艺/优酷/外卖 充值4折起 自从使用Windows 7之后,发现Windows 7并不会自动调用校色后的显示器icc文件.甚至人工切换icc文件时,颜色竟然没跟着转换(这代表icc对应的 ...
- Dcat-Admin框架JS颜色管理--Dcat-Admin框架实战(十六)
目录 一.颜色管理文件位置 二.介绍颜色函数 1.获取内置颜色代码 2.颜色淡化 小探究(JS加不加分号?) 3.深化颜色 小发现(深化/淡化其实是一个函数?) 4.颜色透明化 5.获取所有内置颜色 ...
- 计算机颜色管理器,电脑显示器颜色管理
D.电脑显示器颜色管理: a.桌面鼠标右键选择屏幕分辨率,打开对话框,点击高级: b.点击颜色管理 c.点击下面红框里的颜色管理 d.选择高级,点击设备配置文件的下拉按钮,选择sRGB IEC6196 ...
- AEJoy —— 三分钟了解 AE 相关的颜色空间和颜色管理
目标 了解色彩空间和色彩管理器 什么是颜色管理器 色彩管理器(又称 "色彩管理系统" 或 "色彩管理解决方案" )是一种改变图像和视频的色彩空间的应用程序. 在 ...
- 颜色管理出问题:windows照片查看器无法显示此图片 因为内存不足。
颜色管理 windows照片查看器无法显示此图片,因为计算机上的可用内存可能不足解决方法 3.打开颜色管理窗口,点击"高级". windows照片查看器无法显示此图片,因为计算机上 ...
- vue吸管拾色器、利用canvas获取坐标点颜色、canvas获取坐标点颜色图片跨域、图片转base64、colorPicker
vue吸管拾色器.利用canvas获取坐标点颜色.canvas获取坐标点颜色图片跨域.图片转base64.colorPicker 1.需求:表格中主颜色和次颜色是需要从缩略图上吸取颜色,然后渲染色块, ...
- python使用matplotlib可视化、使用rcParams参数调整可视化图像中线条宽度、线条类型、文本字体、字体大小、字体颜色、字体类型、文本颜色等
python使用matplotlib可视化.使用rcParams参数调整可视化图像中线条宽度.线条类型.文本字体.字体大小.字体颜色.字体类型.文本颜色等 目录
- php设置背景为透明,css如何设置背景颜色透明?css设置背景颜色透明度的两种方法介绍...
在网页布局中有时为了网页的整体美观,可能需要将网页中的某些部分设置为背景颜色透明,那么如何设置背景颜色透明呢?本篇文章就来给大家介绍一下css设置背景颜色透明的方法. 在css中设置背景颜色透明的方法 ...
最新文章
- Io流的字节流与缓冲流
- mysql 和 mongo db 语法对比
- 【Applet编写应用小程序】Applet类APIの基本知识和第一个程序
- 提高 DevTools 控制台调试 console 的 12 种方法
- springcloud gateway 使用nacos 作为配置中心 和 注册中心
- operator* operator- 操作符的使用
- supersr--图形上下文的注意点
- 二十三、Oracle学习笔记:综合案例
- 「本地搭建」worpress博客系统
- 第六天:对项目后端日志存储
- 微信APP支付 C#
- VARCHART XGantt 甘特图用程序应该如何交付
- ramdump crash工具
- 音乐彩灯控制器C语言程序,基于单片机的LED彩灯控制器
- 树莓派Python开发第8课: PWM实验
- 手机开热点但是电脑一直连接不上_电脑连不上wifi,手机可以连上。手机开热点,电脑可以连上。这是怎么回事,电脑就一直循环连接那个w...
- 给我5分钟,手把手带你学会定时任务!
- python timeit.timer_python之timeit模块
- android来电显示,在Android 9中获取来电显示
- 米哈游人工桌面YOYO鹿鸣