Преобразование шестнадцатеричного числа окрашивает к RGB и наоборот

44
задан Jason Sundram 23 November 2011 в 20:45
поделиться

4 ответа

Реальный ответ: Зависит от того, какое шестнадцатеричное значение цвета Вы ищете (например, 565, 555, 888, 8888, и т.д.), сумма альфа-битов, фактическое цветное распределение (rgb по сравнению с bgr...) и тонна других переменных.

Вот универсальный алгоритм для большинства значений RGB с помощью шаблонов C++ (прямо от ScummVM).

template<class T>
uint32 RGBToColor(uint8 r, uint8 g, uint8 b) {
return T::kAlphaMask |
       (((r << T::kRedShift) >> (8 - T::kRedBits)) & T::kRedMask) |
       (((g << T::kGreenShift) >> (8 - T::kGreenBits)) & T::kGreenMask) |
       (((b << T::kBlueShift) >> (8 - T::kBlueBits)) & T::kBlueMask);
}

Вот демонстрационная цветная структура для 565 (стандартный формат для цветов на 16 битов):

template<>
struct ColorMasks<565> {
enum {
    highBits    = 0xF7DEF7DE,
    lowBits     = 0x08210821,
    qhighBits   = 0xE79CE79C,
    qlowBits    = 0x18631863,


    kBytesPerPixel = 2,

    kAlphaBits  = 0,
    kRedBits    = 5,
    kGreenBits  = 6,
    kBlueBits   = 5,

    kAlphaShift = kRedBits+kGreenBits+kBlueBits,
    kRedShift   = kGreenBits+kBlueBits,
    kGreenShift = kBlueBits,
    kBlueShift  = 0,

    kAlphaMask = ((1 << kAlphaBits) - 1) << kAlphaShift,
    kRedMask   = ((1 << kRedBits) - 1) << kRedShift,
    kGreenMask = ((1 << kGreenBits) - 1) << kGreenShift,
    kBlueMask  = ((1 << kBlueBits) - 1) << kBlueShift,

    kRedBlueMask = kRedMask | kBlueMask

};
};
10
ответ дан Vicent Marti 26 November 2019 в 21:32
поделиться

В Python:

def hex_to_rgb(value):
    """Return (red, green, blue) for the color given as #rrggbb."""
    value = value.lstrip('#')
    lv = len(value)
    return tuple(int(value[i:i + lv // 3], 16) for i in range(0, lv, lv // 3))

def rgb_to_hex(red, green, blue):
    """Return color as #rrggbb for the given color values."""
    return '#%02x%02x%02x' % (red, green, blue)

hex_to_rgb("#ffffff")           #==> (255, 255, 255)
hex_to_rgb("#ffffffffffff")     #==> (65535, 65535, 65535)
rgb_to_hex(255, 255, 255)       #==> '#ffffff'
rgb_to_hex(65535, 65535, 65535) #==> '#ffffffffffff'
166
ответ дан Jeremy Cantrell 26 November 2019 в 21:32
поделиться

просто реальный быстрый:

int r = ( hexcolor >> 16 ) & 0xFF;

int g = ( hexcolor >> 8 ) & 0xFF;

int b = hexcolor & 0xFF;

int hexcolor = (r << 16) + (g << 8) + b;
18
ответ дан Julien Roncaglia 26 November 2019 в 21:32
поделиться

Шестнадцатеричное значение является просто числами RGB, представленными в шестнадцатеричном. Таким образом, просто необходимо взять каждую пару шестнадцатеричных цифр и преобразовать их в десятичное число.

Пример:

#FF6400 = RGB(0xFF, 0x64, 0x00) = RGB(255, 100, 0)
2
ответ дан Julien Roncaglia 26 November 2019 в 21:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: