質問

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)そして、ビットシフトによってそれらを再エンセンプすることは、ちょっと輪になって動いています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top