我正在从事一个带有 TFT 触摸屏的项目。这个屏幕有一个包含的库。但是经过一些阅读,我仍然没有得到一些东西。在库中有一些关于颜色的定义:
/* some RGB color definitions */
#define Black 0x0000 /* 0, 0, 0 */
#define Navy 0x000F /* 0, 0, 128 */
#define DarkGreen 0x03E0 /* 0, 128, 0 */
#define DarkCyan 0x03EF /* 0, 128, 128 */
#define Maroon 0x7800 /* 128, 0, 0 */
#define Purple 0x780F /* 128, 0, 128 */
#define Olive 0x7BE0 /* 128, 128, 0 */
#define LightGrey 0xC618 /* 192, 192, 192 */
#define DarkGrey 0x7BEF /* 128, 128, 128 */
#define Blue 0x001F /* 0, 0, 255 */
#define Green 0x07E0 /* 0, 255, 0 */
#define Cyan 0x07FF /* 0, 255, 255 */
#define Red 0xF800 /* 255, 0, 0 */
#define Magenta 0xF81F /* 255, 0, 255 */
#define Yellow 0xFFE0 /* 255, 255, 0 */
#define White 0xFFFF /* 255, 255, 255 */
#define Orange 0xFD20 /* 255, 165, 0 */
#define GreenYellow 0xAFE5 /* 173, 255, 47 */
#define Pink 0xF81F
那些是 16 位颜色。但是它们是如何从:0、128、128(深青色)到 0x03EF 的。我的意思是,如何将 16 位颜色转换为 uint16?这不需要在代码中有答案,因为我只是想在库中添加一些颜色。在线转换器的链接(我找不到)也可以:)
谢谢
最佳答案
从这些很容易找出公式:
#define Red 0xF800 /* 255, 0, 0 */
#define Magenta 0xF81F /* 255, 0, 255 */
#define Yellow 0xFFE0 /* 255, 255, 0 */
F800 设置了 5 个 MSB 位,FFE0 未设置 5 个 LSB。 0xF81F 显然有 5 个 LSB 和 5 个 MSB 的集合,这证明格式是 RGB565。
将值 173 转换为红色的公式并不像看起来那么简单——您不能简单地删除 3 个最低有效位,而是必须进行线性插值以使 255 对应于 31(或绿色 255对应63)。
NewValue = (31 * old_value) / 255;
(这仍然只是一个截断除法——可能需要适当的舍入)
通过适当的舍入和缩放:
Uint16_value = (((31*(red+4))/255)<<11) |
(((63*(green+2))/255)<<5) |
((31*(blue+4))/255);
编辑 JasonD 的建议添加了括号。
关于C++ 定义的 16 位(高)颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13720937/