色の高速ルックアップ テーブルを作成しています。あなたが私に赤の色合いを与えたとしましょう。それから私はそれを最も近い Web セーフカラーに変換し、ルックアップを実行します。それは赤の多くの異なる色合いを返し、私の目的には問題ありません。
現在私が抱えている唯一の問題は、特定の RGB 値を Web セーフ値に変換する方法です。私は PIL と Python を使用しています。独自のアルゴリズムを書くことも気にしませんが、私には少し難しすぎます。
色の高速ルックアップ テーブルを作成しています。あなたが私に赤の色合いを与えたとしましょう。それから私はそれを最も近い Web セーフカラーに変換し、ルックアップを実行します。それは赤の多くの異なる色合いを返し、私の目的には問題ありません。
現在私が抱えている唯一の問題は、特定の RGB 値を Web セーフ値に変換する方法です。私は PIL と Python を使用しています。独自のアルゴリズムを書くことも気にしませんが、私には少し難しすぎます。
PILでそれを行う特定の方法があるかどうかはわかりませんが、RGBカラーがあり、最も近いWebセーフカラーをRGB空間での距離が最小のものとして定義している場合、それを行うことができます次のように:
def getwebsafe(r,g,b):
rw = 51 * ((int(r)+25)//51)
gw = 51 * ((int(g)+25)//51)
bw = 51 * ((int(b)+25)//51)
return (rw,gw,bw)
これは、Web セーフ カラーには、各コンポーネントに 6 つの可能な色合い (0,51,102,153,204,255) があるためです。色のコンポーネントが [0,25] の範囲にある場合、最も近いのは 0、[26-76] の範囲にある場合、最も近いのは 51 などです。
または、リストとして表される rgb カラーの短いバージョン:
def getwebsafe(colour):
return [51*((int(c)+25)//51) for c in colour]
編集: Python が色と Python 2 および 3 に整数以外の数値を使用している場合でも機能するように編集されました。
@pedrosorio の回答の下のコメントで述べたように、テーブル ルックアップを使用することで、これをより効率的に行うことができると思います。これは、事実上すべての数学的計算がテーブルの作成時に 1 回実行され、ピクセルごとではなく 256 回しか実行されないことを意味します。ペドロソリオの式を使用して、私が言いたいことは次のとおりです。
tbl = tuple(51*((int(i)+25)//51) for i in xrange(256))
def websafe(*color):
return tuple(tbl[c] for c in color)
safecolor = websafe(34,55,13)
ただし、数式が 0 ~ 255 の範囲の値をどのようにマッピングするかについてはわかりません。これは、6 つの主要な色合いのそれぞれに次の数のエントリが割り当てられているためです。
shade count
0x00 26
0x33 51
0x66 51
0x99 51
0xcc 51
0xff 26
代わりに、次の少し単純な式を使用します。
tbl = tuple(51*(i//43) for i in xrange(256))
これにより、色合いがより均等に分散されます。
shade count
0x00 43
0x33 43
0x66 43
0x99 43
0xcc 43
0xff 41
配布数がわかれば、数学をほとんど必要としないこのようなこともできます。もちろん、速度が重要でないコードをわざわざ最適化する理由はほとんどありません。
tbl = ((0x00,)*43 + (0x33,)*43 + (0x66,)*43 +
(0x99,)*43 + (0xcc,)*43 + (0xff,)*41)