2016-06-29 7 views
1

私はデータベースから取得し、コントロールの背景をペイントするために使用する色#cccc00を持っています。なぜSystem.Drawing.Colorは 'ff'を16進コードに追加しますか?

文字列が進または色の名前になりますかどうかはわからないので、私はそうのように、文字列をチェックする(すなわちイエローまたは#のcccc00を。):

string color = "#cccc00"; 
if (color.IndexOf('#') >= 0) 
{ 
    Color _color = System.Drawing.ColorTranslator.FromHtml(color); 
    buttonSelector.BackColor = _color; 
    // _color.Name now equals ffcccc00 
} 

これは正常に動作します。問題は、私もその文字列(色)を使用してSQLテーブルを検索することです。問題は、_color.Nameffcccc00を返すため、SQLテーブルに#cccc00というような検索結果が返されないためです。

ffを削除/置き換えて文字列を変更することなく、コントロールのバックカラーを設定するのと同じ形式で値を取得する方法はありますか?私はそれが16進数または実際の色の名前を使用することができるため、削除/置き換えを好まない。

ありがとうございました。

+0

は、透明性のレベルではないですか? rgba(r、g、b、a)のように? –

+0

あなたは何を意味するのか分かりません。 – rbhat

+0

私は色のアルファチャンネルを意味しますが、それは4パートではありません –

答えて

3

最初のバイト(あなたの場合FF)は、の透明度を示します。他の3バイトは色を記述し、エンコーディングに応じて、例えばRGBのようにすることができる。

コードFFFFFFFFは、FFFFFFカラーの透過度を示します。

ここで、FFは最も強い色を表し、00は完全な透明度を表します。

+1

ちょうど答えを完了する:FFは、全く透明でないことを意味し、00は完全に透明であることを意味する。 –

+0

追加、透明度のないHTMLカラーコードに独自の変換機能が必要な場合は、こちらをご覧ください.http://stackoverflow.com/a/14710792/6439999 –

0

これは、色のアルファ成分(透明度)です。一貫したフォーマットが必要な場合は、16進数に変換するR、G、Bコンポーネントから自分で作成することができます。

0

したがって、ffを削除/置換することによって文字列を変更することなく、コントロールのバックカラーを設定するのと同じ形式で値を取得する方法はありますか?

文字列からカラー値を取得するには、ColorTranslator.FromHtmメソッドを使用しました。反対にするには、ColorTranslator.ToHtmlを使用します。

ToHtmlメソッドは16進値を大文字にするため、大文字と小文字を区別しない検索を使用するようにしてください。例えば

string colorA = "#cccc00"; 
Color color = ColorTranslator.FromHtml(colorA); 
string colorB = ColorTranslator.ToHtml(color); // "#CCCC00" 

しかし

string colorA = "AliceBlue"; 
Color color = ColorTranslator.FromHtml(colorA); 
string colorB = ColorTranslator.ToHtml(color); // "AliceBlue" 
0

これは色のアルファチャンネルです。これは、赤、緑、青の成分値のように8ビットで格納されます。赤、緑、青が0(0x00)〜255(0xFF)の範囲にあるように、アルファチャンネルも同様です。アルファチャンネルと

カラー値ではなく、おそらくウェブのに慣れている通常の24ビットの色の実際32ビット長い(4バイト× 8ビット/バイト)です。

アルファチャンネルを使用すると透過効果が得られます。言い換えれば、色の背景とのブレンド方法を制御します。アルファチャンネルの値0(0x00)は、色が完全に透明であることを意味します。基本的に、色はありません。 255のアルファチャンネル値(0xFF)は、色が完全に不透明であることを意味します。 24ビットカラーはアルファチャンネルがないため、常に完全に不透明です。

つまり、#224466は#FF224466と同じ色の正確にはです。

私は理解していますが、#cccc00とは全く異なる色ですので、色として#cccc00ffを使用することはできません。

はい、バイト位置が混ざっているため、色が異なります。アルファチャンネルは常に上位バイトに格納されます(16進表記で書かれたときに最初に来るダブレットです)。

注文番号は#AARRGGBBです。アルファチャンネルの値は上位バイトに格納され、赤は次に、次に緑に、最後に下位バイトに青で格納されます。この命令には何も神聖なものはありませんが、実際にはという標準になっています。

アルファチャンネル情報が不要で、単純に24ビットカラーで作業したい場合は、アルファチャンネルの値を含む上位バイトをトリミングすることができます。または、これをデータベースに保存するだけでも構いません。彼らは同じ色を表すので、それは重要ではありません。

あなたは、必要に応じて、アルファチャンネル値(複数可)を無視して、値を自分で解析することができます。

String RgbColorToHexString(Color clr) 
{ 
    return string.Format("#{0:X2}{1:X2}{2:X2}", 
         clr.R, 
         clr.G, 
         clr.B); 
} 

Color HexStringToRgbColor(String str) 
{ 
    int argb = Int32.Parse(str.Replace("#", ""), NumberStyles.HexNumber); 
    return Color.FromArgb((argb & 0x00FF0000) >> 16, /* red component */ 
          (argb & 0x0000FF00) >> 8, /* green component */ 
          (argb & 0x000000FF));  /* blue component */ 
} 
関連する問題