2015-10-10 80 views
-1

我正在C#中做一些图形,并且需要将6位rgb十六进制(如0xaabbcc(rr gg bb))转换为3个RGB值。我不想使用Color。我没有为Windows开发,因此我不想使用Microsoft.CSharp库。即使有一些解决方法,我并不是很喜欢.NET框架,但我更喜欢创建自己的类库等等。如何从24位十六进制(无.NET框架)获取RGB值

我能够将3个RGB值转换为一个十六进制数字,但我不知道如何做相反的事情。

private static long MakeRgb(byte red, byte green, byte blue) 
{ 
    return ((red*0x10000) + (green*0x100) + blue); 
} 

有我的原始转换代码。

任何人都知道将6位十六进制数分成3个独立字节的好方法吗?

编辑:

使用.NET Framework,使用单声道,和我做访问的System.Drawing.Color。

这不应该被标记为重复,因为它与.NET无关。

+1

使用Color有什么问题?它不在Microsoft.CSharp中。它在System.Drawing中,并且可以在Mono中使用。 – abatishchev

+0

@Cyber​​如果你不是为Windows开发的,我假设你使用Mono,它有'System.Drawing.Color' *和*'Microsoft.CSharp'。你不必避免使用它们。 –

+0

如果你想长时间存储它们,你可以使用位掩码 – Elipzer

回答

3

旧时尚的方式,将在大多数语言工作:

long color = 0xaabbcc; 

byte red = (byte)((color >> 16) & 0xff); 
byte green = (byte)((color >> 8) & 0xff); 
byte blue = (byte)(color & 0xff); 
0

你可以使用bitmasking

private static long MakeRgb(byte red, byte green, byte blue) 
{ 
    return ((red*0x10000) + (green*0x100) + blue); 
} 

private static byte GetRed(long color) 
{ 
    return (byte)((color & 0xFF0000)/0x10000); 
} 

private static byte GetGreen(long color) 
{ 
    return (byte)((color & 0x00FF00)/0x100); 
} 

private static byte GetBlue(long color) 
{ 
    return (byte)((color & 0x0000FF)); 
} 

long color = MakeRgb(23, 24, 25); 

byte red = GetRed(color); 
byte green = GetGreen(color); 
byte blue = GetBlue(color); 
0

两个System.Drawing.ColorMicrosoft.CSharp可在单(我假设你使用,如果你不使用.NET)

在任何情况下,this已经是一个很好的答案,但如果你真的不打算使用System.Drawing.Color ,那么你应该写自己的班级。

class MyColorClass 
{ 
    public byte Red { get; set; } 
    public byte Green { get; set; } 
    public byte Blue { get; set; } 

    public MyColorClass(long color) 
    { 
     Red = (byte)((color >> 16) & 0xff); 
     Green = (byte)((color >> 8) & 0xff); 
     Blue = (byte)(color & 0xff); 
    } 

    public override string ToString() 
    { 
     return string.Format("R: {0} G: {1} B: {2}", Red, Green, Blue); 
    } 
} 

static void Main(string[] args) 
{ 
    long lcolor = MakeRgb(50, 100, 150); 
    MyColorClass color = new MyColorClass(lcolor); 
    Console.WriteLine(color); 
}