投稿者 魔界の仮面弁士  (社会人) 投稿日時 2016/11/14 10:49:09
ちなみに RGB 以外の色空間についても、下記のようにして変換できます。
http://dobon.net/vb/dotnet/graphics/hsv.html


> (透明度というものは全く頭に浮かびませんでした)
普段あまり使わないとは思いますが、コントロールの BackColor や ForeColor でも
透明色を取り扱えるようになっています。

色選択の際に[Web]タブの一番上にある、Transparent は
"不透明度0%(完全透過)の純白"を表します。
この値をコードから指定する場合は、Color.Transparent で表せます。
(この他、"不透明度0%(完全透過)の純黒"を表す Color.Empty もあります)


Transparent 以外の透過色は、一覧に無いので直接入力することになります。
たとえば Form に PictureBox あるいは Panel を貼り付け、
その BackColor プロパティ欄に、直接
「128, 255, 0, 0」と書き込むと、50%透過の赤になり、
「64, 0, 0, 255」と書き込むと 25% 透過の青になります。

その状態で、Form の BackColor や BackgroundImage を
設定すると、半透明色を設定したコントロールにも反映されます。



> 本来は32ビット抜き出すべきなんですね?
RGB や ARGB だけで表しきれるものでも無いので、Color 型変数の値を
正確に表す場合、本来は FromArgb / ToArgb では不足だったりします。

先の回答でも触れていますが、文字列形式で正しく保持したいのであれば、
ColorConverter クラス(≠ColorTranslator クラス)を使って変換するのが望ましいですね。

もちろん、案件によっては RGB 24 bit で十分な場合もあります。
それぞれの違いを念頭において、適宜使い分ければてみてください。


ただ、その色をコントロールに割り当てるのであれば、32bit で保存して置いた方が便利だと思います。
たとえば、緑を &H00FF00 として保持させた場合、
Me.BackColor = Color.FromArgb(&HFF00)
のように指定すると、『透明な背景色をサポートしません。』というエラーになってしまいます。

しかし 32bit で保持していれば、不透明な緑のまま &HFF00FF00 として保持できますので、
Me.BackColor = Color.FromArgb(&HFF00FF00)
にてエラー無く復元できます。
不透明を前提とするのであれば、Alpha 値を自分で補っても良いですけれどね。
Me.BackColor = Color.FromArgb(&HFF, Color.FromArgb( rgb24 ))
'Me.BackColor = Color.FromArgb((-1 << 24) Or rgb24 ) 



> 24ビットだけを抜き出してたのですが
RGB を 24 bit で並べるなら、
Dim rgb1 As Integer = c.R + c.G * 256 + c.B * 256 * 256
Dim rgb2 As Integer = ((c.R * 256) + c.G * 256) + c.B
で計算できます。
16進数にしたいのなら、
 Label1.Text = rgb1.ToString("X6")
とすれば OK です。

前者 rgb1 は 00bbggrr の体系です。(RGB 関数や VBA の色指定など)
後者 rgb2 は 00rrggbb の体系です。(FromArgb メソッドなど)

この形式で渡された 16 進数文字列を Color に復元するのなら、こう書けます。
Dim sColor As String = "abcdef"        'rrggbb 形式 

Dim rgbColor As Integer = Convert.ToInt32(sColor, 16) 
Dim cColor As Color = Color.FromArgb(255, Color.FromArgb(rgbColor))
ただ、このように自前で計算するよりは、先の回答で述べた変換用メソッドを使った方が望ましいです。
プログラムを後で見た時に、変換・復元の処理が対象性的になりますから。