2

したがって、アプリケーションで使用するランダムな色を生成する次の方法があります。

public final Color generateRandomColour() {

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

さまざまな色を取得しますが、これらの色を使用して Swing で明るい色の背景に「長方形」をペイントしているため、比較的暗い色を生成することに興味があります。背景が薄いグレーであるため、生成されたランダムな色も薄いグレーになることがあり、四角形が見づらくなります。

最大フロート値に上限を設定しようとしましたが、暗い色しか得られないようです。どんな助けでも感謝します。

4

6 に答える 6

3

あなたは試すかもしれません:

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

http://docs.oracle.com/javase/6/docs/api/java/awt/Color.html#darker()も参照してください。

于 2013-02-18T09:14:24.030 に答える
3

これはうまくいくようです。Random!の同じインスタンスを使用することに注意してください。1 番目の画像は HSB の B を 0.5f に制限していますが、2 番目の画像はColor.darker()代わりに使用した効果を示しています。

画像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);
        }
    }
}
于 2013-02-18T09:23:17.237 に答える
0

別の色空間でカラーコーディネイトを生成してから、RGBに変換してみてください。LAB色空間を使用することをお勧めします。Lを低く保つと、暗い色になります。

確認していませんが、RBGへの変換はJDKのColorSpaceクラスで実行できるようです。

于 2013-02-18T09:15:12.787 に答える
0

あなたが使用することができます%

new Random().nextFloat() % maxValue;

編集:HSB(Hue Saturation Brightness)を使用しているのがわかりませんでした。最後の値を減らすだけで十分です。

于 2013-02-18T09:12:11.743 に答える
0

私は hsb モデルを使用したことはありませんが、HSB モデルの 3 番目の値は明るさなので、3 番目の値の範囲を制限するだけです。これは、必要な暗い色によって異なります。

于 2013-02-18T09:21:23.367 に答える