你能超过Java中的255 RGB颜色限制吗?

时间:2015-02-18 01:42:03

标签: java

是否可以在java中使用超过255的红色,绿色和蓝色?如果是这样,那些颜色将如何使用?我想知道因为我正在制作一个产生随机颜色矩形的程序,但大多数颜色都是相似的。使用值大于255的颜色和值小于255的颜色有什么不同吗? Jpeg图像格式使用超过255 rgb的颜色值,那么java也可以吗?如果我使用jpeg图像,颜色是否仍会保留超过255 rgb的颜色值?

这是我生成颜色并将形状绘制到屏幕的代码:

    Random r = new Random();
    for(int i = 0;i<=shapes.size()-1;i++){
    Shape s = shapes.get(i);
    int red = r.nextInt(256);
    int green = r.nextInt(256);
    int blue = r.nextInt(256);
    this.colors.add(new Color(red, green, blue));
    //Draw the rectangle
    g.setPaint(this.colors.get(i));
    g.fill(s);
    //Draw the outline
    g.setPaint(Color.black);
    g.draw(s);
    }

我添加了与之前代码中颜色相对应的形状。 &#34;形状&#34;是我的形状的arraylist。 &#34;颜色&#34;是我对应每种形状的颜色的arraylist。

1 个答案:

答案 0 :(得分:3)

这取决于你使用的颜色编码,但是当它归结为强度没有。 24 - 位意味着每个颜色通过 - 如它所说的 - 传送24位:零或一个。 24表示3(颜色通道的数量)乘以8。因此每个频道8位或byte(红色,绿色和蓝色)。您只能使用256位代表8种可能性,因为它是2^8=2*2*2*2*2*2*2*2=256。所以不行。对于24 - 位颜色。因此,255简单地定义为监视器呈现的红色/绿色/蓝色的最大强度。如果你使用默认的 Java 包,我认为它们(几乎)总是会使用24位颜色。

现在,如果你研究图像格式,你会发现一些格式支持更高的比特率。这只意味着您可以更精确地定义颜色。换句话说,如果您使用48位颜色表示,则每个颜色通道将具有16位。在这种情况下,65 535将是最大值,但是(或多或少)等同于255位颜色的24

大多数显示器仅支持24 - 位颜色。通常仅在渲染期间使用更多位(以对图像执行计算)。例如,如果您实现了光线跟踪器,则必须将各种光源添加到一起。或者,如果您实现 Window环境,其中不同的窗口可以具有不同的透明度级别,您可以以更高的精度计算中间结果,以提高结果的质量。

某些相机更精确地捕捉颜色。这可能是有用的,因为工业打印机有时会制作自己的墨水,因此可以更准确地制作颜色。这就是杂志图片通常比在家里打印的图片更好的原因之一。

最后需要注意的是,有些渲染器或(计算机图形)相机甚至会使用更多颜色通道。一位朋友实施了一个渲染彩虹的光线追踪器。为了做到这一点,他实现了七种颜色通道的颜色定义。您不需要它们在屏幕上显示图像,但是您需要它们来计算光与水的相互作用。

修改

关于您的代码:

问题出在你的代码中:

最重要的问题可能是:

Random r = new Random();

在循环中称为 。这有点低效。

接下来,您似乎已经预编码颜色列表。在这种情况下,没有随机发生器会改变颜色。请注意.add只需将新Color 附加到列表的末尾

接下来你打电话:

g.setPaint(Color.black);
g.draw(s);
g.setPaint(this.colors.get(i));
g.fill(s);

所以你首先用黑色绘制形状,然后用你选择的颜色重新绘制它。为什么?您可以通过以下方式替换它:

g.setPaint(this.colors.get(i));
g.fill(s);
g.setPaint(Color.black);
g.draw(s);

最后,您可以通过调用:

来提高颜色的构造效率
Color c = new Color(r.nextInt(16777216));

因此得到的程序将是:

Random r = new Random();
for(int i = 0;i<=shapes.size()-1;i++){
    Shape s = shapes.get(i);
    Color c = new Color(r.nextInt(16777216));
    g.setPaint(c);
    g.fill(s);
    g.setPaint(Color.black);
    g.draw(s);
}