ホーム 主筆 その他ソフト その他情報 Syuhitu.org English

Windows関連

スクリーンセーバー作成法

半透明ウインドウの性能

bootfont.bin

キャビネット形式

ウインドウスタイルをいじる

Java製ソフトをServiceに登録する

イベントログにメッセージを出力する

コントロールパネルにアイコンを追加する

スクリプトによる拡張1

スクリプトによる拡張2

ガジェットの作成

大容量メモリ

メモリ搭載量の下限に挑む

スパースファイルにする

表示されるアイコンの種類を調べてみた

メモリマップIOとエラー処理

ファイルを作る順番と速度の関係

Cryptography API: Next Generationを使う

Windows 10のアクセントカラー

iSCSIディスクにバックアップを取る

サーバプロセスを分離して実装する

サーバプロセスを分離して実装する - F#

レジストリに大量に書き込む

Solaris関連

OpenGL

Solaris設定

ディレクトリの読み込み

主筆プラグイン開発

マルチスレッドでの開発

door

音を出す

Blade100の正しい虐め方

パッケージの作成

画像入出力

BMPファイル

ICOファイル

ANIファイル

JPEGファイル

減色アルゴリズム

減色アルゴリズムの並列化

その他アルゴリズムなど

自由軸回転

Base64

文字列操作

CPU利用率の取得

正規表現ライブラリ

メタボールを作る

メタボールを作る2

正規表現とNFA・DFA

C言語の構文解析

液晶ディスプレイを解体してみた

iSCSIの理論と実装

単一フォルダにファイルを沢山作る

USB-HUBのカスケード接続

SafeIntの性能

VHDファイルのフォーマット

USBメモリに書き込み続けてみた

Windows 10のアクセントカラー

2016年2月20日公開

Windows 10のウインドウ枠の色について考えてみる。

背景から自動的にアクセントカラーを選ぶ

自分で選ぶ場合は明確だが、「背景から自動的にアクセントカラーを選ぶ」というオプションを選択すると、壁紙で使われている色を元に適当にウインドウ枠の色が決定される。

適当とはいっても、これが一体どういうアルゴリズムで選択されているのかが気になる。

多分一番派手な色を選んでる

前に一度、Windows 7のタスクバーの色について調べたことがある。

その時の感覚から、おそらく壁紙の中から(厳密な意味ではなく)最も彩度が高いピクセルの色を選択しているのだろう、ということは推定できる。なので、まずは以下のようなパターンで試してみた。

壁紙の内容 壁紙のイメージ 設定した結果 選ばれた色(タイトルバー)
赤一色 ちょっと暗い赤
黒一色 地味な青
白一色 地味な青
白地に1ピクセルだけ青
白地に1ピクセルだけ赤 ちょっと暗い赤
白地に1ピクセルだけ緑
白地に1ピクセルずつ青と緑
白地に1ピクセルずつ赤と青
白地に1ピクセルずつ赤と緑

ここまででわかる法則として

  1. 面積やピクセル数は無関係で、画像中の彩度が高いピクセルの色を使用する。
  2. ある程度彩度が高い色がない場合には、デフォルトの色が使用される

ということが言える。

ただし、白地に彩度が高いと思われる青・赤・緑を1ピクセルずつ入れた場合に、青>緑>赤の力関係が見受けられることについては、法則性がわからない。

足切りの条件

彩度が低い色しかない場合はデフォルトの色になるというが、ならばその条件は何なのか。とりあえず試してみた。

まず、色相を固定して彩度と明るさを変えてみる。

  明るさ
20% 40% 60% 80%
彩度 20% 壁紙
結果
40% 壁紙
結果
60% 壁紙
結果
80% 壁紙
結果

彩度の値が高くても明るさの値が低ければ黒になってしまう。なので、単純に彩度だけではなく、明るさも選択基準に含まれることは明らかである。しかし条件がわからない。

少なくとも、さらに粒度を上げて調べてみる必要があるだろう。だた、絵を張るのは疲れたから結果のみを示す。

  明るさ
0% 10% 20% 30% 40% 50% 60% 70% 80% 90% 100%
彩度 0% × × × × × × × × × × ×
10% × × × × × × × × × × ×
20% × × × × × × × × × ×
30% × × × × × × ×
40% × × × × ×
50% × × × ×
60% × × × ×
70% × × ×
80% × × ×
90% × × ×
100% × ×

セルの色は壁紙に設定した色を示す。「×」はデフォルトの青が設定され、「○」は壁紙の赤が選択されたことを示す。

境界面が直線になるかどうにかしてくれれば法則もわかろうというものだが、微妙に曲線を描いているようでよくわからない。別のスケールで表される条件に従っているのだろうか?

ということで今度は、輝度と彩度を変えて試してみた。

  輝度
0% 10% 20% 30% 40% 50% 60% 70% 80% 90% 100%
彩度 0% × × × × × × × × × × ×
10% × × × × × × × × × × ×
20% × × × × × × × × × ×
30% × × × × × × × ×
40% × × × × × ×
50% × × × ×
60% × × × ×
70% × × × ×
80% × × × ×
90% × × × ×
100% × ×

先ほどは赤で今度は黄色であるところに理由はない。何も考えていないだけである。

俺の予想では、輝度-彩度で対応させたら、輝度が50%で彩度が100%のところを含む長方形の領域が現れるかと踏んだのだが、そういうことでもないらしい。放物線のような、釣り鐘型のような領域になっている。

結局、どういうスケールで表した何の閾値に従ってデフォルト値にするか否かを判断しているのか、いまいちよくわからない。

派手な色が複数あったら何を選ぶのか

上で、白地に赤と青、赤と緑、緑と青の組み合わせでピクセルを設定した場合の結果を示した。

色相として選択されるであろうピクセルが複数個存在した場合にどの色が選択されるのか? これについては、条件がわからないどころか、何らかの明確なパターンを見つけ出すこともできなかった。

とりあえず、ピクセルの面積や位置で決まるものではないようだ。

壁紙 結果

上記はいずれも、赤としてRGBが(255, 0, 0)、青としてRGBが(0, 0, 255)の色を指定している。何らかの位置関係(例えば左上から走査して最初に見つけた最大値を選択する)といった判断をしているのであれば、上記のいずれかで赤が選択されてもよさそうなものなのだが、常に青が選ばれている。

もしかすると、(255, 0, 0)は(0, 0, 255)よりも彩度(?)が低いと判断しているのかもしれない。だが、青としてRGBが(0, 0, 254)を指定すると、今度は赤が選ばれる。

壁紙 結果

よくわからない。

(255, 0, 0)>(0, 0, 254)なのは明らかだとしても、絶対的に(0, 0, 255)>(255, 0, 0)とする説明がいまいち思い浮かばない。上の方に書いた通り緑>赤という実験結果も出ているので、単純に彩度が同じ場合のソートキーの優先順位が青・緑・赤の順なだけかもしれない。

本当ならここで、彩度(?)が同じ色を複数並べて優先順位を確かめてみたかったのだが、その算出方法(というか判断基準)が不明瞭であるためできなかった。

 


連絡先 - サイトマップ - 更新履歴
Copyright (C)  2000 - 2016 nabiki_t All Rights Reserved.