C++ 定义的 16 位(高)颜色

标签 c++ colors color-picker 16-bit

我正在从事一个带有 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/

相关文章:

c++ - C++中指向自身的成员变量指针

c++ - 如何让 Oxygen 到 "link"以枚举定义?

c++ - 通过 C++ 在 Python 函数中传递参数

java - 更改图形 drawString 颜色

java - 为什么 Java Scene Builder 在程序运行时没有显示确切的背景颜色

ios - 创建一个圆形颜色选择器

java - Android NDK 库仅在运行时不加载三星 galaxy 4.0.2 手机

java - 以编程方式更改复选框颜色

c# - 在 C# Windows 应用程序中将色板保存在 ColorDialog 上

JavaFX - 将图像添加到 ColorPicker