如何将数字转换为argb值?

时间:2015-08-26 00:43:33

标签: java c# rgb

如何将数字转换为argb值,以便

0 -> 0,0,0,0
1 -> 0,0,0,1
...
(16^8)-1 -> 255,255,255,255

反之亦然

0,0,0,0 -> 0
0,0,0,1 -> 1
...
255,255,255,255 -> (16^8)-1

由于

3 个答案:

答案 0 :(得分:0)

您可以使用8位偏移的按位运算符。例如,RGB 255,255,128到整数将是(255 << 16) + (255 << 8) + (128)

如果您需要另一个八位字节,只需添加&lt;&lt; 24 ..喜欢(a << 24) + (r << 16) + (g << 8) + b ..

答案 1 :(得分:0)

作为上述答案的补充解决方案,根据下面的示例代码,(16^8)-1的结果为23。您想要的是白色。这样做有什么特别的理由吗?参考Color

这是你想要做的:

int argb = (16 ^ 8) - 1; //Result is 23 any reason for this?

如果我们使用Color对象的相同颜色转换。

Color c = Color.FromArgb(255, 255, 255, 255);
c.ToArgb(); //We get -1

我们将使用此解决方案获得相同的结果:

int v = (c.A << 24) + (c.R << 16) + (c.G << 8) + c.B; //Result is -1

还原它:

int a = (v >> 24) & 0xFF;
int r = (v >> 16) & 0xFF;
int g = (v >> 8) & 0xFF;
int b = (v) & 0xFF;

如果符合您的需要,请尝试检查上述参考(和实验)。

答案 2 :(得分:0)

完全忽略系统方法,您可以实现一个自定义方法来执行您在C#中所要求的内容,如下所示:

public static long argbToLong(int a, int r, int g, int b)
{
    new[] { a, r, g, b }.Select((v, i) => new { Name = "argb"[i].ToString(), Value = v }).ToList()
        .ForEach(arg =>
        {
            if (arg.Value > 255 || arg.Value < 0)
                throw new ArgumentOutOfRangeException(arg.Name, arg.Name + " must be between or equal to 0-255");
        });
    long al = (a << 24) & 0xFF000000;
    long rl = (r << 16) & 0x00FF0000;
    long gl = (g << 8) & 0x0000FF00;
    long bl = b & 0x000000FF;
    return al | rl | gl | bl;
}

public static Tuple<int, int, int, int> longToArgb(long argb)
{
    var max = Math.Pow(16, 8) - 1;
    if (argb < 0 || argb > max)
        throw new ArgumentOutOfRangeException("argb", "argb must be between or equal to 0-" + max);
    int a = (int)((argb & 0xFF000000) >> 24);
    int r = (int)((argb & 0x00FF0000) >> 16);
    int g = (int)((argb & 0x0000FF00) >> 8);
    int b = (int)(argb & 0x000000FF);
    return new Tuple<int, int, int, int>(a, r, g, b);
}

不确定是什么语言,因为标记了C#和Java。