如何使用C#将十六进制颜色转换为32位ARGB。 (不使用内置颜色功能)
我尝试了这个,但它没有产生正确的颜色:
string colorcode = "#ff465a82";
int argb = Int32.Parse(colorcode.Replace("#", ""), NumberStyles.HexNumber);
先谢谢
更新#1:
找到了这个但不起作用:(我也相信它可以在一行代码中完成)
string colorcode = "ff465a82";
string a = colorcode.Substring(0, 2);
string r = colorcode.Substring(2, 2);
string g = colorcode.Substring(4, 2);
string b = colorcode.Substring(6, 2);
// To integer
int iCol = (a << 24) | (r << 16) | (g << 8) | b;
解决方案
迈克尔刘,你有这个!这是最终解决方案,请注意谷歌地球使用ABGR,标准是ARGB!// Note Google KML Colors are not in standard format of ARGB
// Google KML Colors are stored as ABGR
public int kmlToARGB(string kmlhexcolor)
{
kmlhexcolor = kmlhexcolor.TrimStart('#');
string A = kmlhexcolor.Substring(0, 2);
string B = kmlhexcolor.Substring(2, 2);
string G = kmlhexcolor.Substring(4, 2);
string R = kmlhexcolor.Substring(6, 2);
int decValue = int.Parse(A + R + G + B, NumberStyles.HexNumber);
return decValue;
}
答案 0 :(得分:2)
对UInt32
类型和argb
方法使用unsigned int(Parse
)。
您的号码设置了最高位(因为顶部字节是0xff),如果您将其放入32位有符号的int中,它将被解析为负数。
答案 1 :(得分:1)
我猜你正在使用的绘图API要求颜色值采用AARRGGBB
格式,但原始颜色代码的格式为#AABBGGRR
(反之亦然)。
在解析值之前尝试交换红色和蓝色:
string colorcode = "#ff465a82";
int argb = Int32.Parse(
colorcode.Substring(1, 2) + // Alpha
colorcode.Substring(7, 2) + // Red
colorcode.Substring(5, 2) + // Green
colorcode.Substring(3, 2), // Blue
NumberStyles.HexNumber);
答案 2 :(得分:0)
首先,第二个代码当然会出现语法错误:您正在尝试对字符串进行位移。您认为这应该如何运作?
其次,你不能将其作为带符号的32位整数。使用带符号的32位整数表示的最大数字是2147483648
。 0xFFFFFFFF
虽然是4294967295
。对于无符号32位整数,最大数字也是4294967295
。那不是偶然的。如果查看ARGB十六进制字符串(0x12345678
),可以看到有四个8位数的块,每个块编码一个颜色通道。所以: ARGB颜色是无符号32位整数。
因此,任何尝试从该颜色获取int
将失败。
相反,您必须将uint
类型保留在需要传递ARGB颜色的任何位置。
string colorcode = "ff465a82";
uint argb = uint.Parse(colorcode, NumberStyles.HexNumber);
Console.WriteLine(argb); // 4282800770
Console.WriteLine("Alpha: {0}", argb >> 24); // Alpha: 255
Console.WriteLine("Red: {0}", (argb >> 16) & 0xFF); // Red: 70
Console.WriteLine("Blue: {0}", (argb >> 8) & 0xFF); // Blue: 90
Console.WriteLine("Green: {0}", argb & 0xFF); // Green: 130