Jer*_*ell 166

在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'
Run Code Online (Sandbox Code Playgroud)

  • 我很久以前发布了它,它仍然是我最喜欢的python代码块之一(我写过) (4认同)
  • 在函数中,rgb是3个int的元组.该格式字符串只是一个#后跟三个%02x,它只给出了int的零填充2位十六进制值. (2认同)

Chr*_* H. 37

在python中,hex和'rgb'之间的转换也包含在绘图包中matplotlib.亦即

import matplotlib.colors as colors
Run Code Online (Sandbox Code Playgroud)

然后

colors.hex2color('#ffffff')        #==> (1.0, 1.0, 1.0)
colors.rgb2hex((1.0, 1.0, 1.0))    #==> '#ffffff'
Run Code Online (Sandbox Code Playgroud)

需要注意的是,颜色中的rgb值假定介于0.0和1.0之间.如果你想要在0到255之间,你需要做一个小转换.特别,

def hex_to_rgb(hex_string):
    rgb = colors.hex2color(hex_string)
    return tuple([int(255*x) for x in rgb])

def rgb_to_hex(rgb_tuple):
    return colors.rgb2hex([1.0*x/255 for x in rgb_tuple])
Run Code Online (Sandbox Code Playgroud)

另一个注意事项是colors.hex2color只接受有效的十六进制颜色字符串.


bil*_*dev 18

真的很快:

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

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

int b = hexcolor & 0xFF;

int hexcolor = (r << 16) + (g << 8) + b;
Run Code Online (Sandbox Code Playgroud)

  • 注意运算符优先级:+的优先级高于<< (2认同)
  • 那些不应该&不是&&? (2认同)

Vic*_*rti 10

真正的答案:取决于你正在寻找什么样的十六进制颜色值(例如565,555,888,8888等),alpha位的数量,实际颜色分布(rgb vs bgr ......)和一吨其他变量.

这是使用C++模板(直接来自ScummVM)的大多数RGB值的通用算法.

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);
}
Run Code Online (Sandbox Code Playgroud)

这是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

};
};
Run Code Online (Sandbox Code Playgroud)


Ric*_*era 7

修改Jeremy的python答案来处理短的CSS rgb值,如0,#999和#fff(哪些浏览器会渲染为黑色,中灰色和白色):

def hex_to_rgb(value):
    value = value.lstrip('#')
    lv = len(value)
    if lv == 1:
        v = int(value, 16)*17
        return v, v, v
    if lv == 3:
        return tuple(int(value[i:i+1], 16)*17 for i in range(0, 3))
    return tuple(int(value[i:i+lv/3], 16) for i in range(0, lv, lv/3))
Run Code Online (Sandbox Code Playgroud)