【问题标题】:Can You Go Over The 255 RGB Color Limit In Java你能在 Java 中超过 255 RGB 颜色限制吗
【发布时间】:2015-02-18 01:42:03
【问题描述】:

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

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

【问题讨论】:

  • 上限是255,而不是256
  • @CommuSoft:由于各个颜色字段是从 0 开始的,因此对于每个子颜色、红色、绿色和蓝色,这仍然转换为 256 步。我的问题是为什么OP觉得他需要超过256 * 256 * 256颜色的分辨率?这个问题很不清楚。
  • 嗯,我的印象是用户想要创建像(299,0,50) 这样的颜色,因此具有更高的红色强度。
  • 在原发帖人澄清他的问题之前,我们的猜测很可能是错误的。
  • @HelloWorld:请重新表述您的问题。

标签: java


【解决方案1】:

这取决于您使用的颜色编码,但归结为强度没有。 24-bit 表示每种颜色都是通过 - 正如它所说 - 发送 24 位:零或一。 24 表示3(颜色通道数)乘以8。因此8 位或byte 每个通道(红色、绿色和蓝色)。您只能用8 位表示256 的可能性,因为它是2^8=2*2*2*2*2*2*2*2=256。所以不行。对于24位颜色。 255 因此被简单地定义为显示器呈现的红/绿/蓝的最大强度。如果您使用默认的 Java 包,我认为它们(几乎)将始终使用24 位颜色。

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

大多数显示器仅支持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);
}

【讨论】:

  • g.draw(s);其中一部分是制作大纲。
  • @HelloWorld:在这种情况下,您最好在填充后放置它。一定要站在*Painter's algorithm的角度看,画家先画背景,再画线。
  • @HelloWorld: 和指定的一样,如果您可以直接使用它,我不明白为什么要将 Color 添加到数组列表中。
  • 我添加了颜色,因为每次运行 for 循环时颜色都会改变。
  • 是的,但是在这个过程的后期你会用它做什么吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-29
  • 1970-01-01
  • 2019-09-22
  • 2015-01-25
  • 1970-01-01
  • 2019-06-02
  • 2012-09-14
相关资源
最近更新 更多