在 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);
}
我在前面的代码中添加了与颜色相对应的形状。 “形状”是我的形状数组列表。 “颜色”是我对应于每个形状的颜色的数组列表。
最佳答案
这取决于您使用的颜色编码,但当涉及到强度时,就没有了。 24
位意味着每种颜色都通过发送 24
位来传达:零或一。 24
表示 3
(颜色 channel 数)乘以 8
。因此每个 channel (红、绿和蓝)8
位或一个字节
。您只能用 8
位表示 256
可能性,因为它是 2^8=2*2*2*2*2*2*2*2=256
。所以不行。对于 24
位颜色。因此,255
被简单地定义为显示器呈现的红/绿/蓝的最大强度。如果您使用默认的 Java 包,我认为它们(几乎)将始终使用 24
位颜色。
现在,如果您研究图像格式,您会发现某些格式支持更高的比特率。这仅意味着您可以更精确地定义颜色。换句话说,如果您使用 48
位颜色表示,则每个颜色 channel 将具有 16
位。在这种情况下,65 535
将是最大值,但这(或多或少)相当于 24
位颜色的 255
。
大多数显示器仅支持 24
位颜色。更多位通常仅在渲染期间使用(对图像执行计算)。例如,如果您实现光线追踪器,则必须将所有类型的光源添加在一起。或者,如果您实现一个窗口环境,其中不同的窗口可以具有不同的透明度级别,您可以以更高的精度计算中间结果,以提高结果的质量。
某些相机捕捉颜色更精确。这很有用,因为工业打印机有时会制造自己的墨水,因此可以更准确地打印颜色。这就是杂志图片通常比在家打印的图片更好的原因之一。
最后一点是,某些渲染器或(计算机图形)相机甚至使用更多颜色 channel 。一位 friend 实现了渲染彩虹的光线追踪器。为了做到这一点,他实现了具有七个颜色 channel 的颜色定义。您不需要它们在屏幕上显示图像,但需要它们来计算光与水的相互作用。
编辑
关于您的代码:
问题出在您的代码中:
最重要的问题可能是:
Random r = new Random();
在循环内部被调用。这有点低效。
接下来,您似乎已经对颜色列表进行了预编码。在这种情况下,随机生成器不会改变颜色。请注意,.add
只是将新颜色
追加到列表末尾。
接下来你调用:
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);
}
关于java - Java 中可以超过 255 RGB 颜色限制吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28574541/