Как получить серый цвет на экране 128х128

Dmti
Dmti аватар
Offline
Зарегистрирован: 13.10.2013

Использую библиотеки: Adafruit_GFX.h Adafruit_ST7735.h, в библиотеке есть настроенные цвета - 

// Color definitions
#define Black   0x0000
#define Blue    0x001F
#define Red     0xF800
#define Green   0x07E0
#define Cyan    0x07FF
#define Magenta 0xF81F
#define Yellow  0xFFE0
#define While   0xFFFF
 
но мне надо серый, светло-серый, и темно-серый, а ещё - темно-синий, и светло-голубой. Полдня сижу, не могу понять, как цвета формируются. Как сделать цвет темнее или светлее, не меняя его тон?
DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

5 бит красный 6 бит зеленый, 5 бит синий. Примерно так

struct Color_t {

uint8_t Blue: 5;

uint8_t Green:6;

uint8_t Red:5;

}

 

Dmti
Dmti аватар
Offline
Зарегистрирован: 13.10.2013

0xF800/2 +  0x07E0/2 + 0x001F/2 = не серый, а как получить серый?

Dmti
Dmti аватар
Offline
Зарегистрирован: 13.10.2013

Понял как, FFFF-> 65535, отнимаем кратное 8 (8, 16. .. 256, ... 512) и получаем цвет с уменьшенной яркостью, если к белому, то градацию серого. Всего 10 градаций каждного цвета.

b707
Offline
Зарегистрирован: 26.05.2017

Dmti пишет:

 Всего 10 градаций каждного цвета.

про "всего 10 градаций" - бред какой то...

Берете нужный RGB цвет и конвертируете в RGB565 - в библиотеке ADAfruit даже готовая функция есть

// Pass 8-bit (each) R,G,B, get back 16-bit packed color
uint16_t Adafruit_ILI9341::color565(uint8_t r, uint8_t g, uint8_t b) {
  return ((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3);
} 

а кроме того, в любой библиотеке куча уже готовых цветов, например

// Color definitions
#define ILI9341_BLACK       0x0000      /*   0,   0,   0 */
#define ILI9341_NAVY        0x000F      /*   0,   0, 128 */
#define ILI9341_DARKGREEN   0x03E0      /*   0, 128,   0 */
#define ILI9341_DARKCYAN    0x03EF      /*   0, 128, 128 */
#define ILI9341_MAROON      0x7800      /* 128,   0,   0 */
#define ILI9341_PURPLE      0x780F      /* 128,   0, 128 */
#define ILI9341_OLIVE       0x7BE0      /* 128, 128,   0 */
#define ILI9341_LIGHTGREY   0xC618      /* 192, 192, 192 */
#define ILI9341_DARKGREY    0x7BEF      /* 128, 128, 128 */
#define ILI9341_BLUE        0x001F      /*   0,   0, 255 */
#define ILI9341_GREEN       0x07E0      /*   0, 255,   0 */
#define ILI9341_CYAN        0x07FF      /*   0, 255, 255 */
#define ILI9341_RED         0xF800      /* 255,   0,   0 */
#define ILI9341_MAGENTA     0xF81F      /* 255,   0, 255 */
#define ILI9341_YELLOW      0xFFE0      /* 255, 255,   0 */
#define ILI9341_WHITE       0xFFFF      /* 255, 255, 255 */
#define ILI9341_ORANGE      0xFD20      /* 255, 165,   0 */
#define ILI9341_GREENYELLOW 0xAFE5      /* 173, 255,  47 */
#define ILI9341_PINK        0xF81F 

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

начни с 0xFFFF - это белый.  Потом красную и синюю составляющую уменьшай на 1, а зеленую - на 2, и выводи.  Так все серые аттенки пройдешь, от белого до чёрнаго. 

b707
Offline
Зарегистрирован: 26.05.2017

DetSimen пишет:

начни с 0xFFFF - это белый.  Потом красную и синюю составляющую уменьшай на 1, а зеленую - на 2, и выводи.  Так все серые аттенки пройдешь, от белого до чёрнаго. 

получицца, кстати , 32 градации... а вовсе не 10

Dmti
Dmti аватар
Offline
Зарегистрирован: 13.10.2013

Dmti пишет:

в библиотеке ADAfruit даже готовая функция есть

// Pass 8-bit (each) R,G,B, get back 16-bit packed color
uint16_t Adafruit_ILI9341::color565(uint8_t r, uint8_t g, uint8_t b) {
  return ((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3);
} 

В моей не было, спасибо вам - теперь есть, прекрасно работает.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

b707 пишет:

получицца, кстати , 32 градации... а вовсе не 10

Может, он привык пользоваться 32-чной системой.