java - Java 中可以超过 255 RGB 颜色限制吗

标签 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);
    }

我在前面的代码中添加了与颜色相对应的形状。 “形状”是我的形状数组列表。 “颜色”是我对应于每个形状的颜色的数组列表。

最佳答案

这取决于您使用的颜色编码,但当涉及到强度时,就没有了。 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/

相关文章:

java - wait()、notify() - 用于快速读取文件

java - 按下主页按钮后如何在Android中播放mediaPlayer并在收到电话时恢复播放视频?

java - 使用不相交集在无向图中进行循环检测?

java - Java 销售点系统的多级密码加密

java - Jersey REST 和 PathParam 正则表达式

java - WebSphere javax.naming.NamingException 和连接被拒绝

java - Eclipse:如何在 Tomcat 上部署引用其他动态 Web 项目的动态 Web 项目

java - 重写我的世界服务器(获取/编辑源代码并重新编译)

java - 从浮点小端到大端再转换回来的问题

java - Stripes 1.5 - 有什么方法可以向系统询问所有 ActionBean 的列表吗?