投稿者 魔界の仮面弁士  (社会人) 投稿日時 2016/11/12 12:01:55
> 負の数字で「-65536」と出る場合と正の数字で「16711680」と出る場合があるのですが、
16711680 は &H00FF0000 相当、
-65536 だと &HFFFF0000 相当ですよね。


RGB を各色 8bit で表した場合、合計 24bit なので、Integer型(32bit)には 8bit足りません。
その 8 bit をどのように扱うのか、という話になります。


【ARGB Color の場合】透明度対応:あり、既知カラー対応:なし
16 進数表記で aarrggbb という並びになります。R,G,B各色を8bitで表し、
残り8bit を透明度/不透明度(Alpha)として扱います。
完全不透明だと Alpha = &HFF、完全透過だと Alpha = &H00 です。

Color から ARGB Color 値への変換は Color の .ToArgb() メソッドで行えます。
ARGB Color 値から Color への変換は Color.FromArgb( argb ) メソッドです。

Color.Red と Color.FromArgb(&HFFFF0000) は、どちらも不透明な純赤を示しており、
ARGB としては同じ値ですが、Color 構造体としては別の色であることに注意が必要です。

透明度を扱わない処理系では、32bitではなく24bit範囲の 00rrggbb が要求される
ケースがありますが、そのような場合は Alpha 部を切り落としてしまうのが良いでしょう。

Dim rgb24 As Integer = color値.ToArgb() And &H00FFFFFF




【OLE Color の場合】透明度対応:なし、既知カラー対応:システムカラーのみ
VB6 や VBA でいうところの vbRed や vbButtonFace などはこれに当たります。透明度はありません。
&H80000000~&H8000001E の範囲がシステムカラーを表し、
それ以外は 00bbggrr の形式で RGB カラーを表します。R,G,B の並び順に注意。
たとえば FF0000 という色は、ARGB Color では青ですが、OLE Color では赤を意味します。

Color から OLE Color 値への変換は ColorTranslator.ToOle( c ) メソッドで行えます。
OLE Color 値から Color への変換は ColorTranslator.FromOle( oleColor ) メソッドです。

なお、ここでいうシステムカラーとは、.NET では SystemColors クラスのメンバーのことを指し、
デスクトップ背景色やタイトルバーの色など、実行環境によって設定色が異なる色のことです。


【Win32 Color の場合】透明度対応:なし、既知カラー対応:なし
GDI32.DLL の API などで使われる色指定です。
16進数で 00bbggrr の形式で RGB カラーを表します。この点では OLE Color と同じですが、
システムカラーを変換した場合は、その実行環境における RGB カラーとして変換されるため、
他の環境で実行した場合のシステムカラーとは必ずしも一致しません。

Color から OLE Color 値への変換は ColorTranslator.ToOle( c ) メソッドで行えます。
OLE Color 値から Color への変換は ColorTranslator.FromOle( oleColor ) メソッドです。



【HTML Color の場合】透明度対応:文字列からの復元時のみ対応、既知カラー対応:WebColorとWebシステムカラーに対応
Web の HTML や CSS で使われる色指定です。
数値としてではなく、"#F00"、"#FF0000"、"Red"、"activeborder" などの文字列で表現される形式です。

Color から HTML Color 値への変換は ColorTranslator.ToHtml( c ) メソッドで行えます。
HTML Color 値から Color への変換は ColorTranslator.FromHtml( htmlColor ) メソッドです。



【QBColor の場合】透明度対応:なし、既知カラー対応:なし
QuickBASIC という古い BASIC 言語で使われていた色指定であり、
コンソール画面で使われいた 16色のみを扱う表現です。

使用できるカラーコードは 0~15 の 16 種であり、
QBColor( 0~15 ) 関数を使うことで、OLE Color な整数値に復元できます。

これを Color 構造体に復元するには、ColorTranslator を使う必要があります。
(Color.FromArgb で変換しているサンプルをたびたび見掛けますが、それは間違いです)

たとえば、カラーコード12(明るい赤)を Color にする場合は、
Dim c As Color = ColorTranslator.FromOle( QBColor(12) )
となります。



【プロパティ永続化の場合】透明度対応:あり、既知カラー対応:あり
Color を文字列として表現するための、完全なる文字列永続化形式であり、
Form デザイナ等でも使われる表現です。

Color を文字列に変換する場合は、ColorConverter の ConvertToInvariantString メソッドを使い、
その文字列を Color に復元するには ColorConverter の ConvertFromInvariantString メソッドを使います。

既知カラーとRGBカラー、たとえば Color.Red と Color.FromArgb(&HFFFF0000) を区別して保持できますし、
システムカラーもシステムカラーのまま保持でき、透明度にも対応した形式です。

例えば、透明度を持つ色「Color.FromArgb(1, 2, 3, 4)」を変換した結果は
"1, 2, 3, 4" という Alpha, Red, Green, Blue な文字列になりますし、
「Color.Red」を変換した結果は "255, 0, 0" ではなく "Red" になります。
また、「SystemColors.Desktop」を変換した結果は "Desktop" です。