首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更改rgb颜色值以表示值

更改rgb颜色值以表示值
EN

Stack Overflow用户
提问于 2009-09-14 21:05:15
回答 4查看 4.9K关注 0票数 1

我正在尝试在java的画布上进行颜色更改,以重新呈现颜色所呈现的值相对于彼此的强弱程度。

rgb颜色必须是相同的颜色,只是不同的色调,比如白到灰再到黑,以及介于两者之间的每一种灰色。考虑到我表示的值变化很大,从-9999999到正9999999,我如何更改rgb值。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-09-14 21:32:32

是的,调整您的值以适合您的领域。这取决于RGB值是如何存储的。通常,每一个都使用8位。由于灰色具有R=G= B,因此您希望缩放值的范围为(-9999999,9999999)到(0,255)。

考虑第一个区间中的x。由于第一个范围也覆盖负数,因此首先进行移位。

X=x+ 9999999

现在x在区间(0,19999998)内。下一步是将其缩小到(0,255)。由于颜色值在该时间间隔内呈线性增长,因此您所要做的就是:

X=x* 255 / 19999998

现在x在区间(0,255),正如您所希望的那样。

通常,如果您的初始值在一个区间(a,b)中,并希望将其转换为(0,c),请应用以下公式:(请注意,a可以是负数)

X= (x - a) *c/ (b - a)

因此,如果R、G、B值为16位长,则c将为2**16 = 65536,公式为:

X= (x + 9999999) * 65536 / 19999998

希望这能有所帮助。

票数 3
EN

Stack Overflow用户

发布于 2009-09-14 21:24:23

我认为你应该看看HSL/HSV而不是RGB。

虽然RGB在本质上是基本的,因为它用原色来表示颜色,但它不允许您对R、G或B值进行“可理解”的更改以获得“相似”的颜色。使用HSL/HSV模型,您将能够更改亮度/亮度/值(L/V)以获得灰度值不同的颜色,或更改色调(H)以获得跨光谱的相似颜色。您可以从全亮度(白色)开始,通过减小L/V值来创建较暗的灰色色调,最终达到无亮度(黑色)的颜色。

一个非常温和的introduction to color theory, for developers is available here

至于你的问题,你应该用HSL来表达你的颜色,增加饱和度的值,以获得从白色到黑色的颜色范围。当然,如果你想要在白色和黑色之间的灰色色调,而不是任何其他颜色,你应该保持最小的色调。

下面是一个关于如何获取一系列颜色的简短示例。为简洁起见,我将颜色填充到一个数组中,但这并不是必需的,因为您可能希望立即使用颜色(除了考虑内存需求之外)。

代码语言:javascript
复制
private Color[] produceColorRange(int steps)
{
    float value = 1.0f; //Starting with full brightness
    Color[] colors = new Color[steps];
    for(int ctr = 0; ctr < steps; ctr++)
    {
        value = value - (1.0f/steps); //tend to darkness
        int rgb = Color.HSBtoRGB(0.7f, 0.0f, value); //create a darker color
                                             //Hue is Blue, not noticeable
                                             //because Saturation is 0
        Color color = new Color(rgb);
        colors[ctr] = color;
    }
    return colors;
}

如果你使用上面的方法并绘制一个JFrame,你将能够得到类似于下面的结果(除了我已经修改了色调和饱和度来获得我的颜色范围)。

请注意,如果需要一种获取颜色范围的更简单方法,请使用Color.WHITE初始化color对象并调用color.darker()。当然,您将无法控制增量。

票数 4
EN

Stack Overflow用户

发布于 2009-09-14 21:17:08

我不完全确定我是否理解你的问题,但是,如果我理解了:

为什么不将RGB值缩放到您的范围内的值(从-9999999到正9999999)?此外,将R、G和B都设置为相同的值,以便使用灰色阴影来表示该值。

如下所示:

代码语言:javascript
复制
private final int MIN = -9999999;
private final int MAX = 9999999;

public Color getScaledColor(int val) {
    int gray = (int) Math.round((double) (val - MIN) / (double) (MAX - MIN)
            * 255.0);
    Color color = new Color(gray, gray, gray);

    return color;
}

请注意,此解决方案不会为指定范围内的所有值提供唯一的颜色。但也要记住,人眼只能区分这么多种色调(2* 9999999 +1可能比它所能区分的色调数量更多)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1423925

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档