2

所以我有以下方法来生成我在应用程序中使用的随机颜色:

public final Color generateRandomColour() {

    return Color.getHSBColor(new Random().nextFloat(),
            new Random().nextFloat(), new Random().nextFloat());
}

我得到了一系列不同的颜色,但是当我使用这些颜色在 Swing 中用浅色背景绘制“矩形”时,我对生成相对较暗的颜色感兴趣。背景是浅灰色的,所以有时生成的随机颜色也是浅灰色的,这使得很难看到矩形。

我试图对最大浮点值设置一个上限,但它似乎并没有让我只看到更深的颜色。任何帮助表示赞赏。

4

6 回答 6

3

你可以试试:

public final Color generateDarkColor() {
  return generateRandomColour().darker();
}

另请参阅http://docs.oracle.com/javase/6/docs/api/java/awt/Color.html#darker()

于 2013-02-18T09:14:24.030 回答
3

这似乎有效。注意使用相同的实例Random!第一张图片将 HSB 的 B 限制为 0.5f,而第二张图片显示了使用的效果Color.darker()

图像 HSB 颜色.darker()

import java.awt.*;
import java.awt.image.BufferedImage;
import javax.swing.*;
import java.util.Random;
import java.util.logging.*;
import javax.imageio.ImageIO;
import java.io.*;

class DarkHSB {

    float darker = .5f;
    Random r = new Random();

    public final Color generateRandomColor(boolean useHsbApi) {
        float brightness = (useHsbApi ? r.nextFloat() * darker : r.nextFloat());
        // Random objects created sequentially will have the same seed!
        Color c = Color.getHSBColor(
                r.nextFloat(),
                r.nextFloat(),
                brightness);
        if (!useHsbApi) c = c.darker();
        return c;
    }

    public void paint(Graphics g, int x, int y, int w, int h, boolean useApi) {
        g.setColor(generateRandomColor(useApi));
        g.fillRect(x,y,w,h);
    }

    public static void main(String[] args) {
        Runnable r = new Runnable() {

            @Override
            public void run() {
                final JPanel gui = new JPanel(new GridLayout(0,1));

                final DarkHSB dhsb = new DarkHSB();
                int w = 300;
                int h = 100;

                BufferedImage hsb = new BufferedImage(w,h,BufferedImage.TYPE_INT_RGB);
                Graphics g = hsb.getGraphics();
                int sz = 5;
                for (int xx=0; xx<w; xx+=sz) {
                    for (int yy=0; yy<h; yy+=sz) {
                        dhsb.paint(g,xx,yy,sz,sz,true);
                    }
                }
                g.dispose();

                BufferedImage darker = new BufferedImage(w,h,BufferedImage.TYPE_INT_RGB);
                g = darker.getGraphics();
                for (int xx=0; xx<w; xx+=sz) {
                    for (int yy=0; yy<h; yy+=sz) {
                        dhsb.paint(g,xx,yy,sz,sz,false);
                    }
                }
                g.dispose();

                gui.add(new JLabel(new ImageIcon(hsb)));
                gui.add(new JLabel(new ImageIcon(darker)));

                JOptionPane.showMessageDialog(null, gui);

                File userHome = new File(System.getProperty("user.home"));
                File img = new File(userHome,"image-hsb.png");
                dhsb.saveImage(hsb,img);
                img = new File(userHome,"image-darker.png");
                dhsb.saveImage(darker,img);
            }
        };
        // Swing GUIs should be created and updated on the EDT
        // http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html
        SwingUtilities.invokeLater(r);
    }

    public void saveImage(BufferedImage bi, File file) {
        try {
            ImageIO.write(bi, "png", file);
        } catch (IOException ex) {
            Logger.getLogger(DarkHSB.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}
于 2013-02-18T09:23:17.237 回答
0

你可以使用%

new Random().nextFloat() % maxValue;

编辑:没有看到您正在使用 HSB(色相饱和度亮度)。只需减少最后一个值就足够了。

于 2013-02-18T09:12:11.743 回答
0

尝试在另一个颜色空间中生成颜色坐标,然后转换为 RGB。建议您使用LAB 颜色空间。如果你保持 L 低,那么你会得到深色。

我没有检查过,但看起来可以通过 JDK 中的ColorSpace类完成到 RBG 的转换。

于 2013-02-18T09:15:12.787 回答
0

我从未使用过 hsb 模型,但 HSB 模型中的第三个值是亮度,所以你需要做的就是限制第三个值的范围。这取决于你想要多深的颜色。

于 2013-02-18T09:21:23.367 回答
0

这应该生成相对较暗的颜色。

    Random r = new Random();
    Color c = new Color(r.nextInt(100),r.nextInt(100),r.nextInt(100));
于 2013-02-18T09:27:45.840 回答