2013-02-18 220 views
2

所以,我对于生成,我在我的应用程序中使用随机颜色下面的方法:随机生成的“暗”颜色只在Java

public final Color generateRandomColour() { 

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

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

我试图把上限设置为最大浮动值,但它似乎并没有让我只有更深的颜色。任何帮助赞赏。

+1

见http://stackoverflow.com/questions/6396201/how-do-i-generate-random-dark-colors-in-c – home 2013-02-18 09:13:22

回答

0

你可以使用%

new Random().nextFloat() % maxValue; 

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

0

尝试生成其他颜色空间的颜色coordingates,然后转换为RGB。建议您使用LAB Color space。如果你让你低,那么你会得到深色。

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

0

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

3

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

Image HSBColor.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); 
     } 
    } 
} 
+0

谢谢你的回答:) – DSF 2013-02-18 09:36:56

0

这应该产生颜色的都比较暗。

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