Windows 7は、タスクバーの「カラーホットトラッキング」に使用する色をどのように計算しますか?


20

これはかなり長い間興味をそそられてきました。

Windows 7 Aeroが現在実行中のアプリのタスクバーボタンのホットトラッキングホバーハイライトとして使用する色を決定するために使用するアルゴリズムを知っている人はいますか?

Windows 7タスクバーのホバーカラー

それは間違いなくアプリのアイコンに基づいていますが、色の値を取得している特定のパターンを見ることができません。

しません、次のいずれかのように見えます。

  1. アイコン全体の平均色値。それ以外の場合は、Chromeのようなマルチカラーアイコンで常に茶色になります。
  2. 画像で最も使用されている色。そうでない場合は、SQL Server Management Studioアイコンが黄色になります(左から6番目)。また、Chromeアイコンは、赤、緑、黄色を均等に使用していました。
  3. Chromeはアイコンの上部を示す赤であり、Notepad ++(右から2番目)はアイコンの下部を示す緑であるため、アイコン内の特定のピクセル座標にある色。

ux.stackoverflow.comでこの質問をしたところ、トピック外として閉じられましたが、誰かが次のように答えました:


このMSDNブログ記事でRaymond Chenが説明したとおり:

一部の人々は、それがどのように行われたかを尋ねます。それは本当に特別なことではありません。コードは、アイコン内の主要な色を探すだけです。(そして、ビジュアルデザイナーはこの種のことのこだわりであるため、この計算の目的上、黒、白、グレーの陰影は「色」とは見なされません。)


しかし、「主な」色がどのように計算されるかを説明していないので、私はその答えに本当に満足していませんでした。確かに、少なくとも私の目には、SQL Management Studioアイコンの主な色は黄色です。しかし、ハイライトは緑色です。 具体的には、アルゴリズムが何であるかを知りたい。


An average colour value from the entire icon, otherwise you would get brown all the time.それは意味がありません。たとえば、Skypecommand-prompt、またはµTorrentのアイコンは、平均して茶色になりますか?ಠ_ఠ(最後にWindowsの色計算アルゴリズムの1つをリバースエンジニアリングしたとき、最終的にそれを理解するのに数年の注意と多くの異なる作業が必要でした。これをハッキングすることになりそうですある時点で1つ。)
Synetech 14年

@Synetechあなたは正しいです-私は利用可能なアイコンの広い配列と複数の色を含むそれらの多くについて考えていました。たとえば、ChromeアイコンまたはIISアイコンには、それぞれ赤、緑、黄色と青、緑、黄色と青が含まれています。私は、これらが平均して暗い茶色になってしまうとゆっくりと考えましたが、多かれ少なかれモノクロのアイコンには適用されないのは正しいことです。
theyetiman 14年

ONT投稿はありコメントこののChromeのバージョンについての質問にリンクし、リンクされたページは、クロームのソース・コードを調べることによって、それを説明します。(少なくともそのための)説明は、正確な単純なアルゴリズムではありません。
Synetech 14年

@Synetechの素敵な発見-今、私たちはどこかに来ています。これは私が探していたものの線に沿っています。今、Win7のソースコードを入手できれば...;)
theyetiman 14年

私は推測していますが、すべてのピクセルは3次元空間にあります(各色に1つの値)。それらを例えば10x10x10のグループ/キューブに分割し、RGB / RGB(12,56,97)がグループ/キューブ(10-20,50-60,90-100)に入るようにします。これらのグループにピクセルを分割するとき、どれが最大かを追跡します。最後に、最も多くのピクセルを持つグループを平均することにより、支配的な色を決定します。その場合、グループのサイズはパフォーマンス/精度のトレードオフになります。
mxt3 14

回答:


14

Windows 7のデスクトップへようこそで正確に35分で:

27種類のバケットにわたる正規化された色ヒストグラムであり、黒、白、アルファチャネル、グレーを抽出し、最も支配的なRGBV [sic]値を使用します...

「RGBV」は問題ではないようだから、スピーカーが「RGB」と言うつもりだったのはかなり確かだ。「正規化された」部分は実際には重要ではありません。各「バケット」に入るピクセル数を効果的にカウントしています。したがって、各ピクセルは、各チャネルの値の位置に基づいて、27バケット(3次元配列に配置され、27の立方根が3)の1つに入れられます。Windowsは、各色チャネルについて、その色の強度が範囲の下部、中間、または上部のチャンクにあるかどうかを判断します。範囲は約0〜60、60〜200、および200〜255のようです。完全に透明なピクセルはまったく含まれていません。

Windowsは、黒、白、グレーの3つのチャネルすべてが範囲の同じ3分の1にあったバケットを無視して、どのバケットに最も多くのピクセルがあるかを見つけます。これがSQL Server Management Studioアイコンの説明です。黄色に見えるものの多くは、実際には「白い」バケツにダンプされ、無視されます。

許容されるバケットのいずれにもピクセルがない場合、システムの配色に関係なく、プログラムは水色のオーバーレイを取得します。(コマンドプロンプトを参照してください。)プログラムにアイコンがない場合は、Windowsのデフォルトアイコンが青または緑のオーバーレイを生成する場合でも、白/半透明のオーバーレイを取得します。

複数のプログラムが同じハイライト色を持つのを止めるものは何もありません。たとえば、最新のChromeアイコンは、Windows 8のエクスプローラーと同じ黄色になります。

同点がある場合、画像内の色の順序に依存しない事前に決められた順序があります。これはおそらく、最大値が見つかった方法の結果である可能性があります。以前にチェックされたバケットは、後のバケットが結合した場合でも最大値のままです。黄色は最初にチェックされたバケットの1つであるようです。

勝ったバケツが見つかると、ハイライトの色はバケツの範囲の中央のどこかに設定されているようです。

テストケース(提供される数値はRGB値です):

明るい黄色(255、247、209)→デフォルトのハイライト
赤47(47、0、0)→デフォルトのハイライト(60、0、0
赤60)→濃い赤
赤66(66、0、0)→濃い赤
暗赤色(165、0、0)→赤
グレー128( 128、128、128)→デフォルトのハイライト
半分(0、148、255)および(255、0、0)→赤
もっと半分(0、255、0)および(255、216、0)で同じ領域→黄色は
同じ逆同じだが反転→黄色
ホワイトレッド180(255、180、180)→明るい赤
ホワイトレッド210(255、210、210)→デフォルトのハイライト
四分の一純粋な青、純粋な黄色、純粋な赤、同じ面積の純粋な緑→黄色
白赤61(255、61、61)→赤
赤82(82、 0、0)→濃い赤


これは、これまでで最も魅力的な答えです。ありがとうございました。それは私が問題を抱えていたすべてを説明し、また徹底的な深さに入ります。ブラボー。
theyetiman

@Ben NIは、これが馬鹿げた質問のように見えることを知っていますが、それでもです。なぜ27個のバケットなのか?私はそれが3 ^ 3であることを知っており、最初の3つはR、G、Bの色だと思いますが、2つ目の3は何の略ですか?
aexl

@TheSexiestManinJamaicaそれはただarbitrary意的だと思います。多分Microsoftは3 ^ 3の優雅さを気に入っていました。可能な色が非常に少ない(3 ^ 2は9のみ)ことと、多くの可能な色(3 ^ 4は81)があることとのバランスが取れています。
ベンN

0

私の推測では、各色について、上から始めて、R、G、およびBの値を取得し、それらから3つの最高値と最低値を取得して比較します。最高と最低の差が最も大きい色は、画像で最も明るい色になります。さて、たとえば、Chromeアイコンの場合、いくつかの色が最大のギャップに結び付けられているかもしれませんが、赤が上にあるため、最初に遭遇します。(Chromeロゴを120度回転させ、緑または黄色が支配的かどうかを確認するなど、独自のアイコンを設計することでこれをテストできると思います。)


0

私がそれを理解する方法から-OSは色を決定する際にいくつかの要因を考慮に入れます。

  1. OSによってこのアプリケーションにすでに色が割り当てられていますか?その場合は、7にスキップします。
  2. この色はプログラムコードで定義されていますか?その場合は、プログラムから事前定義された色を使用します。(はい、これを制御するWindowsプログラムの変数設定があります、いいえ、正確な変数名はわかりません)
  3. 1 = false(定義済みの色を意味しない)の場合、使用するアイコンの主要な色を定義します。(このため、黒、白、グレーの色は無視されます)
  4. 使用する単一の色を2で定義できず、使用する他の色よりも支配的な場合は、アイコンの平均RBG値を定義します。定義された色が達成される場合、これを使用します。この目的のために、白、黒、灰色、茶色の色は完全に無視されます。
  5. 3がブラックリストの色(黒白またはグレー)のいずれかになる場合、ブラックリストの色を侵害することなく、平均RBG値を最も厳密に表す色をランダムに割り当てます。
  6. 色の割り当てが正常に完了したら、後ですばやく色を割り当てるために、色情報をレジストリに保存します。
  7. 割り当てられた色が、現在開いている別のアプリケーションで既に使用されている色と一致する場合、割り当てられた色の15%以内のランダムな色相量だけ色をオフセットします。
  8. 表示色。

これは非常に間違っている可能性があり、大部分は推測ですが、これにより、OSが色を決定するために非常によく使用できる方法を理解しやすくなります。また、事前に定義された色と同量の色を使用するアイコンのないプログラムに、白/茶色/黒が割り当てられない理由、および黒、白、灰色が割り当てられない理由についても説明します。また、アイコンを持たないプログラム(まだいくつかあります)が透明なホットトラッキングカラーを表示することに注意してください。ホバーすると、アイコンが単に「明るく」なります。


アプリケーションが独自の色を定義する方法はありません。また、同じ色を持つ2つのプログラムに対するルールはないようです。しかし、興味深いアイデア。
ベンN

-2

画像のRGBカラーを平均化するVBコードを次に示します。

Function AverageRGB(ByRef P As PictureBox) As Long

Dim Count As Long
Dim Red As Long
Dim Green As Long
Dim Blue As Long
Dim Hexed As String
Dim X As Long
Dim Y As Long
Count = 0


For X = 0 To P.Width Step P.Width \ 32


    For Y = 0 To P.Height Step P.Height \ 32
        Hexed = Right("00000" & Hex(P.Point(X, Y)), 6)
        Red = Red + CLng("&h" & Right(Hexed, 2))
        Green = Green + CLng("&h" & Mid(Hexed, 3, 2))
        Blue = Blue + CLng("&h" & Left(Hexed, 2))
        Count = Count + 1
    Next

Next

AverageRGB = RGB(Red \ Count, Green \ Count, Blue \ Count)
End Function

OSでの使用に最適化されているわけではありませんが、基本的なアイデアが得られるはずです- ソース


3
彼はすでにそれが単純な/基本的な平均ではないと説明した。コードを介してChromeアイコンを実行すると、それが実際に表示されます。
Synetech 14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.