2013-02-18 72 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));