将 KML 十六进制颜色转换为 32 位 ARGB



如何使用 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;
}

我猜您使用的绘图 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);

argb类型和Parse方法使用无符号 int (UInt32)。

您的数字设置了顶部位(因为顶部字节是 0xff),如果您将其放入 32 位有符号的 int 中,它将被解析为负数。

所以首先,第二个代码当然给出了语法错误: 您正在尝试对字符串进行位移。你认为这应该如何运作?

其次,不能将其作为有符号 32 位整数。可以用有符号 32 位整数表示的最大数字是 2147483648 。 不过0xFFFFFFFF 4294967295。对于无符号的 32 位整数,最大数字也是4294967295。这并非偶然。如果你看一下 ARGB 十六进制字符串 ( 0x12345678 ),你可以看到有四个 8 位数字块,每个块编码一个颜色通道。所以:ARGB 颜色是无符号的 32 位整数

因此,任何尝试从该颜色获取int都将失败。

相反,您必须在需要传递 ARGB 颜色的任何位置保留 uint 类型。

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

最新更新