如何将数字转换为argb值

本文关键字:argb 转换 数字 | 更新日期: 2023-09-27 18:09:45

如何将数字转换为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

谢谢

如何将数字转换为argb值

作为上述答案的附加解,给定下面的示例代码,(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;

试着检查上面的参考(和实验),如果这将符合您的需要。

完全忽略系统方法,您可以实现一个自定义方法来完成您在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都有标记

您可以使用8位偏移的位运算符。例如,在RGB中255,255,128 to integer将是(255 << 16) + (255 << 8) + (128)

如果你需要另一个八位字符,只需加上<<24 . .像(a << 24) + (r << 16) + (g << 8) + b ..