49

これを行う最も効率的な方法は何ですか?

4

10 に答える 10

172

パイソンでは:

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'
于 2008-10-18T06:02:40.243 に答える
41

Python では、hex と 'rgb' の間の変換もプロット パッケージに含まれていますmatplotlib。すなわち

import matplotlib.colors as colors

それで

colors.hex2color('#ffffff')        #==> (1.0, 1.0, 1.0)
colors.rgb2hex((1.0, 1.0, 1.0))    #==> '#ffffff'

色の 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])

もう 1 つの注意点は、colors.hex2color有効な 16 進カラー文字列のみを受け入れることです。

于 2014-10-22T21:52:10.577 に答える
19

すぐに:

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

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

int b = hexcolor & 0xFF;

int hexcolor = (r << 16) + (g << 8) + b;
于 2008-10-18T01:39:21.460 に答える
10

本当の答え: 探している 16 進数の色の値の種類 (565、555、888、8888 など)、アルファ ビットの量、実際の色の分布 (rgb と bgr など)、および大量の色によって異なります。他の変数。

これは、C++ テンプレートを使用したほとんどの RGB 値の一般的なアルゴリズムです (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

};
};
于 2008-10-18T01:57:11.847 に答える
7

0、#999、#fff などの短い CSS RGB 値を処理するように Jeremy の python 回答を変更します (ブラウザーは黒、中程度の灰色、白としてレンダリングされます)。

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))
于 2011-09-25T21:34:52.890 に答える
2

16 進数値は、16 進数で表された単なる RGB 数値です。したがって、16 進数の各ペアを 10 進数に変換するだけです。

例:

#FF6400 = RGB(0xFF, 0x64, 0x00) = RGB(255, 100, 0)
于 2008-10-18T01:38:12.510 に答える
1
#!/usr/bin/env パイソン

再輸入
システムのインポート

def hex_to_rgb(値):
  値 = 値.lstrip('#')
  lv = len(値)
  return tuple(int(value[i:i+lv/3], 16) for i in range(0, lv, lv/3))

def rgb_to_hex(rgb):
  rgb = eval(rgb)
  r = rgb[0]
  g = rgb[1]
  b = rgb[2]
  return '#%02X%02X%02X' % (r,g,b)

デフメイン():
  color = raw_input("HEX [#FFFFFF] または RGB [255, 255, 255] 値 (値なしでプログラムを終了): ")
  ながら色:
    if re.search('\#[a-fA-F0-9][a-fA-F0-9][a-fA-F0-9][a-fA-F0-9][a-fA-F0 -9][a-fA-F0-9]', 色):
      変換 = hex_to_rgb(色)
      変換された印刷物
    elif re.search('[0-9]{1,3}, [0-9]{1,3}, [0-9]{1,3}', 色):
      変換 = rgb_to_hex(色)
      変換された印刷物
    elif の色 == '':
      sys.exit(0)
    そうしないと:
      print '有効な値が入力されていません!'
    color = raw_input("HEX [#FFFFFF] または RGB [255, 255, 255] 値 (値なしでプログラムを終了): ")

__name__ == '__main__' の場合:
  主要()
于 2011-07-06T22:11:24.073 に答える
1

これは、私が c++11 で使用するために作成したコードの一部です。16 進値または文字列を送信できます。

    void Color::SetColor(string color) {
    // try catch will be necessary if your string is not sanitized before calling this function.
         SetColor(std::stoul(color, nullptr, 16));
    }

    void Color::SetColor(uint32_t number) {
        B = number & 0xFF;
        number>>= 8;
        G = number & 0xFF;
        number>>= 8;
        R = number & 0xFF;
    }



 // ex:
 SetColor("ffffff");
 SetColor(0xFFFFFF);
于 2014-03-16T06:43:53.600 に答える