是否可以在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。
答案 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);
}