c定义16位(高)颜色

新手上路,请多包涵

我正在开发一个带有 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?这不需要在代码中有答案,因为我只想在库中添加一些颜色。一个在线转换器的链接(我找不到)也可以:)

谢谢

原文由 Bart Teunissen 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 684
2 个回答

从这些可以很容易地找出公式:

 #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 的有益建议添加了括号。

原文由 Aki Suihkonen 发布,翻译遵循 CC BY-SA 3.0 许可协议

基于 unwind 的回答,特别是使用 Arduino 2.8” TFT Touchscreen(v2) 的 Adafruit GFX 库,您可以将此函数添加到您的 Arduino 草图中并使用它内联来计算 rgb 的颜色:

 uint16_t getColor(uint8_t red, uint8_t green, uint8_t blue)
{
  red   >>= 3;
  green >>= 2;
  blue  >>= 3;
  return (red << 11) | (green << 5) | blue;
}

现在您可以像这样内联使用它,用一个在 x0,y0 处创建一个 20x20 正方形的函数进行说明:

 void setup() {
  tft.begin();
  makeSquare(getColor(20,157,217));
}

unsigned long makeSquare(uint16_t color1) {
  tft.fillRect(0, 0, 20, 20, color1);
}

可以在 此处 找到 Adafruit GFX 库的文档

原文由 Jeff Weinberg 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏