如何从 24 位十六进制获取 RGB 值(不使用 .NET Framework)[重复]

Posted

技术标签:

【中文标题】如何从 24 位十六进制获取 RGB 值(不使用 .NET Framework)[重复]【英文标题】:How to get RGB values from 24-bit Hex (Without .NET Framework) [duplicate] 【发布时间】:2016-01-08 01:30:54 【问题描述】:

我正在用 C# 做一些图形,我需要将 6 位 rgb 十六进制,例如 0xaabbcc (rr gg bb) 转换为 3 个 RGB 值。我不想使用Color。我不是为 Windows 开发的,所以我不想使用 Microsoft.CSharp 库。即使由于所有花哨的绒毛,我不太喜欢 .NET 框架,但我更喜欢制作自己的类库等。

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

private static long MakeRgb(byte red, byte green, byte blue)

    return ((red*0x10000) + (green*0x100) + blue);   

有我的原始转换代码。

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

编辑:

使用 .NET 框架,使用 Mono,而且我确实有权访问 System.Drawing.Color。

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

【问题讨论】:

使用颜色有什么问题?它不在 Microsoft.CSharp 中。它在 System.Drawing 中,在 Mono 中可用。 @Cyber​​ 如果你不是为 Windows 开发,我假设你使用的是 Mono,它有 System.Drawing.Color Microsoft.CSharp。您不必避免使用它们。 如果你想长期存储,你可以使用位掩码 特别是这个answer 显示了仅使用位操作的转换。 我没有使用 Mono。 【参考方案1】:

适用于大多数语言的老式方式:

long color = 0xaabbcc;

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

【讨论】:

【参考方案2】:

你可以使用位掩码

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);

【讨论】:

【参考方案3】:

System.Drawing.ColorMicrosoft.CSharp 在 Mono 上都可用(如果你不使用 .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);
 

【讨论】:

以上是关于如何从 24 位十六进制获取 RGB 值(不使用 .NET Framework)[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Excel/VBA 中获取 RGB 颜色的相应十六进制值?

将 8 位十六进制颜色转换为 rgba 颜色?

如何获得十六进制颜色值而不是 RGB 值?

从 24bpp 位图中获取每个像素的 RGB 值,以便在 C 中转换为 GBA 格式

如何将 RGB 输入转换为十进制颜色代码?

如何从AVFrame:data里获取RGB24数据和YUYV422数据