随机生成"黑暗"只有Java的颜色

时间:2013-02-18 09:08:28

标签: java swing random colors

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

public final Color generateRandomColour() {

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

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

我试图在最大浮动值上加上一个上限,但它似乎并没有让我只有更暗的颜色。任何帮助表示赞赏。

6 个答案:

答案 0 :(得分:3)

您可以尝试:

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

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

答案 1 :(得分:3)

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

Image HSB Color.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);
        }
    }
}

答案 2 :(得分:0)

您可以使用%

new Random().nextFloat() % maxValue;

编辑: 没看到你正在使用HSB(色调饱和度亮度)。 只需减少最后一个值即可。

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

这会产生相对较暗的颜色。

    Random r = new Random();
    Color c = new Color(r.nextInt(100),r.nextInt(100),r.nextInt(100));