所以我有以下方法来生成我在我的应用程序中使用的随机颜色:
public final Color generateRandomColour() {
return Color.getHSBColor(new Random().nextFloat(),
new Random().nextFloat(), new Random().nextFloat());
}
我得到了一系列不同的颜色,但是当我使用这些颜色在Swing的浅色背景上绘制“矩形”时,我有兴趣生成相对较暗的颜色。背景为浅灰色,因此有时生成的随机颜色也是浅灰色,这使得很难看到矩形。
我试图在最大浮动值上加上一个上限,但它似乎并没有让我只有更暗的颜色。任何帮助表示赞赏。
答案 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()
的效果。
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));