14

ビデオに表示される上位16色にインデックスを付けるアプリケーションがあります。

ユーザーが色を選択できる別のアプリケーションを作成しようとしています。アプリケーションは、この色が表示されるすべてのビデオを検索します。

問題は、ビデオごとに16色しかインデックス付けしないため、ユーザーがRGBカラーを選択することです。この色がインデックス付けされる可能性は非常に低いため、ほとんどの場合、私のアプリケーションは結果を返しません。

私はこの作品を作る方法を考えました-ビデオに現れる色にインデックスを付けて、それらを最も近い8ビット色に変換することができました。

次に、ユーザーがRGBカラーを選択すると、ユーザーの選択を同じ8ビットの最も近いカラーに変換できます。

このように私は常に試合があります。

私が今抱えている唯一の大きな問題は、RGBカラーを最も近い8ビットカラーに変換する方法です。

4

7 に答える 7

11

Web セーフ パレットに変換するには、r、g、b の各コンポーネントの範囲を 0 ~ 255 から 0 ~ 5 に変換し、それらを組み合わせる必要があります。

color = (r*6/256)*36 + (g*6/256)*6 + (b*6/256)
于 2012-10-09T21:48:30.683 に答える
6

あなたがする必要があるのは、RGB を HSB (色相飽和輝度) 値に変換することです。HSB は RGB と同様に 3 バイトですが、違いは、HSB 値は RGB よりもはるかに簡単に比較できることです。

次のステップは、「重要度」の重み付けを決定することです。たとえば、彩度や明るさではなく、「色/色相」だけを気にする場合は、S バイトと B バイトを破棄して、カラー バイトだけを使用できます。

私が 8 ビットに制限されている場合、4 ビットの色情報 (16 の異なる色)、3 ビットの彩度 (8 つの異なる値)、および 1 ビットの明るさ情報 (明るいまたは暗い) を使用します。

この記事では、Java で HSB を実行する方法について説明します。

http://java.sys-con.com/node/43559

この記事のソース コードには、Java で RGB から HSB へのコンバーターが含まれています。

于 2012-10-09T21:43:53.257 に答える
0

Floyd–Steinberg ディザリングをご存知ですか? これは、高次の色を低次の色に変換するために使用されます。たとえば、24 ビット RGB を 3 ビット (8 色) RGB に変換したり、GIF 変換のために RGB イメージを 8 ビット (256 色) に制限したりします。

このアルゴリズムは、リンクされたウィキペディアのページで説明されています。

于 2012-10-09T21:42:10.590 に答える
0

24 bpp 画像を 8 bpp 画像に変換する場合は、次のアルゴリズムを試してください。

for y = 0 to ImageHeight - 1
   for x = 0 to ImageWidth - 1
      GetPixel(x,y,red,grn,blu)
      {read RGB data from 24bpp file}
      d0 = red^2 + grn^2 + blu^2
      ColorIndex = 0
      for cl = 0 to 255
         GetPaletteData(p_red,p_gre,p_blu)
         {read RGB data from 8bpp palette}
         d = (red - p_red)^2 + (grn - p_grn)^2 + (blu - p_blu)^2
         if d0 >= d then
            ColorIndex = cl
            d0 = d
         end if
      next cl
        {use ColorIndex to create your 8bpp file}
     next x
   next y

このステップの前に、ウィキペディアまたはその他のソースから 8bpp ファイルの詳細を読んでください。

幸運を!

于 2015-12-14T20:29:36.097 に答える