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

时间:2013-12-23 15:10:15

标签: c#

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

}

3 个答案:

答案 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位整数表示的最大数字是21474836480xFFFFFFFF虽然是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