如何将数字转换为 argb 值?
How to convert number to argb value?
如何将数字转换为 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
谢谢
您可以使用具有 8 位偏移量的位运算符。例如,在 RGB 255,255,128
中,整数将是 (255 << 16) + (255 << 8) + (128)
如果您需要另一个八位字节,只需添加 << 24.. 就像 (a << 24) + (r << 16) + (g << 8) + b
..
作为上述答案的附加解决方案,给出下面的示例代码,(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 被标记了。
如何将数字转换为 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
谢谢
您可以使用具有 8 位偏移量的位运算符。例如,在 RGB 255,255,128
中,整数将是 (255 << 16) + (255 << 8) + (128)
如果您需要另一个八位字节,只需添加 << 24.. 就像 (a << 24) + (r << 16) + (g << 8) + b
..
作为上述答案的附加解决方案,给出下面的示例代码,(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 被标记了。