ARGB カラーをその形式に変換する必要が生じるまで、デバイスのコントロール クラスを作成していました。最初に、私はこの関数を書きました(うまくいきました):
private static int convertFormat(System.Drawing.Color c)
{
String all;
int a = (int)((float)c.A / 31.875);
if (a == 0)
a = 1;
all = a.ToString() + c.B.ToString("X").PadLeft(2, '0') + c.G.ToString("X").PadLeft(2, '0') + c.R.ToString("X").PadLeft(2, '0');
int num = int.Parse(all, System.Globalization.NumberStyles.AllowHexSpecifier);
return num;
}
しかし、それはとても醜いので、もっとエレガントなソリューションを書きたかったのです。そこで、0 から 50 までのすべての組み合わせを試して、正しい値を取得するためにいくつかのことを行いました。
private static int convertFormatShifting(System.Drawing.Color c)
{
int alpha = (int)Math.Round((float)c.A / 31.875);
int a = Math.Max(alpha,1);
return (a << 24) | (c.B << 48) | (c.G << 40) | (c.R << 32);
}
動作します!
しかし今、これらが正しいシフト値である理由を誰かに説明してもらいたいです。