質問
System.Drawing.Colorには、色のINT表現を返すTOARGB()メソッドがあります。
Silverlightでは、system.windows.media.colorを使用する必要があると思います。 a、r、g、bメンバーがありますが、単一の値を返す方法はありません。
toargb()を実装するにはどうすればよいですか? system.drawing.colorでは、toargb()が構成されています
return (int) this.Value;
System.Windows.Media.Colorには、fromArgb(byte a、byte r、byte g、byte b)メソッドがあります。 fromArgb()で使用するために、toargb()によって返されたintを分解するにはどうすればよいですか?
ポインターをありがとう...
解決
短くて速い。追加のメソッド呼び出しがありませんが、迅速な操作があります。
// To integer
int iCol = (color.A << 24) | (color.R << 16) | (color.G << 8) | color.B;
// From integer
Color color = Color.FromArgb((byte)(iCol >> 24),
(byte)(iCol >> 16),
(byte)(iCol >> 8),
(byte)(iCol));
他のヒント
ここで2つの質問をしているように聞こえますが、もう1つ刺してみましょう。とにかく、あなたはの使用を検討する必要があります BitConverter
クラス。
から このページ:
32ビットARGB値のバイト順序はARRGGBBです。
だから、実装する ToArgb()
, 、あなたは書くことができます 拡張法 それはこのようなことをします:
public static int ToArgb(this System.Windows.Media.Color color)
{
byte[] bytes = new byte[] { color.A, color.R, color.G, color.B };
return BitConverter.ToInt32(bytes, 0);
}
そして、「toargb()によって返されたintを分解してfromArgb()で使用するために」、これを行うことができます。
byte[] bytes = BitConverter.GetBytes(myColor.ToArgb());
byte aVal = bytes[0];
byte rVal = bytes[1];
byte gVal = bytes[2];
byte bVal = bytes[3];
Color myNewColor = Color.FromArgb(aVal, rVal, gVal, bVal);
お役に立てれば。
短いメモ:
「色」オブジェクトの整数表現を取得すると、マークされた回答でビットシフト操作を使用する代わりに、color.toargb()を直接呼び出すと、4倍高速になるようです。したがって、.toargb()にアクセスできる場合は、常にそれを使用してください!
スレッドの作成者は、彼がそれにアクセスしていないと述べたので、もちろん顕著な答えはまだ正しいです、Juseはその中の主張された「速い操作」に混乱しないでください。
留意.b)そして、ビットシフトによってそれらを再エンセンプすることは、ちょっと輪になって動いています。