如何将一个整数转换为红色、绿色和蓝色的值

6

我正在使用以下代码将RGB值转换为一个整数:

public static int RGBtoInt(int red, int greed, int blue)
{
    return blue + green + (green * 255) + (red * 65536);
}

但是我在编写一个接受整数并返回单个RGB组件的反向方法时遇到了困难。

需要具有以下主题性质:

public static Vector3 IntToRgb(int value)
{
    // calculations...
    return new Vector3(red, green, blue); 
}
Color.FromArgb(int)方法没有创建我需要的RGB颜色。
上面的RGBtoInt函数匹配OpenGL返回的RGB整数值,我正在寻找一种反向方法。这是与此处使用的相同转换方法。

1
除非您想避免使用 System.Drawing,否则只需使用 Color.FromArgb()Color.ToArgb()。无需编写自己的代码。 - Luaan
1
请注意,您的 RGBtoInt() 方法似乎不正确。看起来应该是 return b + (g * 255) + (r * 65536); - Matthew Watson
Color.FromArgb(int)方法没有创建我需要的RGB颜色。也许这是因为你的RGBtoInt()中有错误? - Matthew Watson
我需要它与OpenGL返回的整数颜色值匹配,这些值以该格式返回。 - livin_amuk
我以为OpenGL中的RGB值是介于0.0f和1.0f之间的浮点数? - Matthew Watson
显示剩余2条评论
2个回答

15

可以按照以下步骤进行转换。

public static Vector3 IntToRgb(int value)
{
    var red =   ( value >>  0 ) & 255;
    var green = ( value >>  8 ) & 255;
    var blue =  ( value >> 16 ) & 255;
    return new Vector3(red, green, blue); 
}
根据我的理解,最初的转换应该按照以下方式进行。
public static int RGBtoInt(int r, int g, int b)
{
    return ( r << 0 ) | ( g << 8 ) | ( b << 16 );
}

然而,如果某些API提供的方法可用,则应优先考虑使用它们。 - Codor
2
初始转换应为 ( r >> 0 ) | ( g >> 8 ) | ( b >> 16 );(请注意使用 | 而不是 &)。 - Dmitry Bychenko
@DmitryBychenko 感谢您的评论,我把它们搞混了。 - Codor
我实际上通过另一种方式解决了主要问题,即通过将OpenGL返回的像素数据格式从“PixelFormat.Rgb”更改为“PixelFormat.Bgr”。无论如何,虽然这并没有在技术上回答我的问题(通过反转我的公式),但我基于其信息性而接受了它。 - livin_amuk
1
初始转换中的移位应该向左而不是向右。 - Jeff

3
尝试这样做:Color c = Color.FromArgb(someInt);,然后使用c.Rc.Gc.B分别表示红、绿和蓝的值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接