5

色の高速ルックアップ テーブルを作成しています。あなたが私に赤の色合いを与えたとしましょう。それから私はそれを最も近い Web セーフカラーに変換し、ルックアップを実行します。それは赤の多くの異なる色合いを返し、私の目的には問題ありません。

現在私が抱えている唯一の問題は、特定の RGB 値を Web セーフ値に変換する方法です。私は PIL と Python を使用しています。独自のアルゴリズムを書くことも気にしませんが、私には少し難しすぎます。

4

3 に答える 3

4

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 に整数以外の数値を使用している場合でも機能するように編集されました。

于 2012-10-24T22:19:54.163 に答える
1

@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)
于 2012-10-25T00:00:02.563 に答える