【问题标题】:Generate random "dark" colours only in Java仅在 Java 中生成随机的“深色”颜色
【发布时间】:2013-02-02 16:07:50
【问题描述】:

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

public final Color generateRandomColour() {

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

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

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

【问题讨论】:

标签: java swing random colors


【解决方案1】:

你可以试试:

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

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

【讨论】:

    【解决方案2】:

    这似乎有效。注意使用Random 的同一个实例!第一张图将 HSB 的 B 限制为 0.5f,而第二张图显示了使用 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);
            }
        }
    }
    

    【讨论】:

    • 感谢您的有趣回答 :)
    【解决方案3】:

    你可以使用%

    new Random().nextFloat() % maxValue;
    

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-12-05
            • 2013-12-31
            • 1970-01-01
            • 2014-10-08
            • 1970-01-01
            • 1970-01-01
            • 2011-09-17
            • 2013-07-15
            相关资源
            最近更新 更多