これを行う最も効率的な方法は何ですか?
10 に答える
パイソンでは:
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'
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 進カラー文字列のみを受け入れることです。
すぐに:
int r = ( hexcolor >> 16 ) & 0xFF;
int g = ( hexcolor >> 8 ) & 0xFF;
int b = hexcolor & 0xFF;
int hexcolor = (r << 16) + (g << 8) + b;
本当の答え: 探している 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
};
};
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))
16 進数値は、16 進数で表された単なる RGB 数値です。したがって、16 進数の各ペアを 10 進数に変換するだけです。
例:
#FF6400 = RGB(0xFF, 0x64, 0x00) = RGB(255, 100, 0)
#!/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__' の場合: 主要()
これは、私が 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);