当前位置: 首页 > 知识库问答 >
问题:

RGB和一个整数值/浮点值之间的转换

冯宏恺
2023-03-14

我想问一下是否可以在RGB和表示颜色范围的一个连续颜色值之间进行转换(例如在浮点数[0…1]或整数[0…255]中)。

E、 我有一个像彩虹一样的连续颜色范围:

红色-橙色-黄色-绿色-蓝色-靛蓝-紫色

-

现在我想将值(0.5 =绿色)转换为相等的RGB值([0,1,0]?)。使用传递函数(后向和前进)可以做到这一点吗?也许在蟒蛇?

共有3个答案

吴建中
2023-03-14

函数将在一个方向上进行传输(单个值到rgb)...

f(x,i) = max(0,min(1,3 * ABS(1-2 *(x-I/3)mod 2))-1))

…如果您将rgb值定义为

{f(x,0), f(x,1), f(x,2)}

它从红色(对于x=0)开始,在黄色(x=1/6)、绿色(x=2/6)和青色(x=3/6),蓝色(x=4/6),洋红色(x=5/6)之间线性插值,再次以红色(x=1)结束整个循环。

万俟穆冉
2023-03-14

最简单的方法是简单地将RGB相加,同时对每个组件进行加权。这样做将为您提供一个范围 0-16,777,215。例如:

RGB Tuple = Hex Value = Decimal
0,0,0 = 0x000000 = 0
255,255,255 = 0xFFFFFF = 16777215

这是一个在线计算器,可以转换任何一种颜色:https://www.shodor.org/stella2java/rgbint.html

任何给定语言的十六进制转换器代码都将遍布谷歌。:)

你可以使用任何你喜欢的数字空间(例如0-1或其他什么),并来回移动,只要你选择的数字空间能容纳1670万种独特的颜色。

如果你压缩数字空间,你会失去一些颜色(正如第一张海报所解释的)。

董和风
2023-03-14

RGB需要3个数字的全部原因是因为它本质上是一个3D空间。您将尝试将3个连续的数字行压缩为1!你必须选择一个比例尺,像下面这样玩一下,看看你喜欢哪种颜色混合…(代码用VBA编写,但很容易移植)

For i = 1 To 255   
    ' Scale with no red, increase and decrease blue and green respectively
    Range("a" & i).Interior.Color = RGB(0, i, 255 - i)
    ' Use a MOD function to keep the values between 0 and 255
    ' note this can cause some abrupt changes in your scale
    Range("b" & i).Interior.Color = RGB(128 + i Mod 255, i, 255 - i)
    ' You can increase and decrease different RGB values for desired result
    Range("c" & i).Interior.Color = RGB((255 - i) Mod 255, (0 + i) Mod 255, i)    
Next i

输出(列排成行以便在此处更好地查看):

因此,要从RGB转换为1D比例(如上所述),只需将i作为单个变量,您可以根据需要存储查找,或者创建一个函数,该函数与上面的每一行一样,从i的单个值创建颜色。

现在从1D尺度回到3D尺度在技术上是不可能的。您已经丢失了您需要的额外信息。但是,如果您知道创建比例的映射函数,您可以通过相应的输入简单地获得每个RGB值。

希望这能有所帮助。

 类似资料:
  • 问题内容: 好的,所以我正在研究一个程序,该程序会摄取图像,将一个像素块隔离到一个数组中,然后为该数组中的每个像素获取每个单独的rgb值。 当我这样做时 它吐出-16106634 我需要从这个int值中获取(R,G,B)值 有公式,算法,方法吗? 问题答案: 该方法始终返回颜色模型中的像素。因此,您只需要为每种颜色隔离正确的位,如下所示: 如果您碰巧需要alpha组件: 另外,您可以使用构造函数以

  • 对于这些代码行,我得到0作为输出,即它们都是相等的。现在,如果我理解正确,a b和c可能会存储稍微不同版本的真值.3因此,当做一个Float.compare(...)对这些值,我希望得到一个输出值,而不是0。为什么我把它们取为0?

  • 问题内容: 我正在做s和s的乘法和除法,但我忘记了隐式转换规则(问题中的单词似乎太含糊,以至于Google不能比在这里问得更快)。 如果我有两个s,但我想进行浮点除法,是否只需要强制转换一个或两个操作数?如何相乘-如果我将a 和an 相乘,答案是a 吗? 问题答案: 您不能将结果除以a ,反之亦然。 因此答案是: 如果我有两个s,但是我想做浮点除法…? 一个演员就足够了。 如果我将a 和an 相乘

  • 编辑:我明白为什么浮点算术是不精确的,但不明白为什么它会不一致。 尊敬的C可靠地确认了0.1+0.2==0.3适用于单精度浮点,但不适用双精度浮点。

  • 问题内容: 我在互联网上找到了一种将RGB值转换为HSV值的方法。不幸的是,当值是R = G = B时,由于0/0操作,我得到的是NaN。 您是否知道Java中是否存在用于此转换的实现方法,或者当我获得0/0除法以获取正确的HSV值时该怎么办? 这是我的方法,它是根据Internet上的一些代码改编而成的: 问题答案: 我很确定您想要的是RGBtoHSB

  • 问题内容: 我试图找到最大的立方根,即整数,小于12,000。 我不确定如何检查它是否是整数!我可以将其转换为字符串,然后使用索引来检查最终值,看看它们是否为零,但这似乎很麻烦。有没有更简单的方法? 问题答案: 要检查浮点值是否为整数,请使用以下方法: 该方法已添加到Python 2.6中的类型中。 请考虑在Python 2中为(整数操作数的底数除法!),并且浮点算术可能不精确(a是使用二进制分数