创造更明亮的颜色? (JAVA)

时间:2013-09-06 00:44:05

标签: java

我尝试使用java.awt.Color提供的默认颜色

创建更亮的颜色

但是当我使用2种颜色绘制时,它们看起来是一样的吗?

Color blue = Color.BLUE;
Color brighterBlue = blue.brighter();

test.setColor(blue);
test.fillCircle(size);

test.setColor(brighterBlue);
test.drawCircle(size);

2 个答案:

答案 0 :(得分:7)

有很多方法可以解决这个问题。

最明显的方法是在现有颜色值中添加一个分数,例如......

int red = 128;
float fraction = 0.25f; // brighten by 25%

red = red + (red * float);

相反,您可以将加载因子应用于颜色。我们知道颜色元素的最大值是255,因此您可以将颜色元素增加所有颜色范围的因子,而不是尝试增加颜色因子本身,例如

int red = 128;
float fraction = 0.25f; // brighten by 25%

red = red + (255 * fraction); // 191.75

这基本上将色彩元素增加了255倍而不是......厚颜无耻。现在我们还需要考虑到颜色永远不会超过255

的事实

这将允许你强制颜色接近白色,变亮,黑色变暗;

enter image description here

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class BrighterColor {

    public static void main(String[] args) {
        new BrighterColor();
    }

    public BrighterColor() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();
            Rectangle rec = new Rectangle(0, 0, getWidth(), getHeight() / 2);
            g2d.setColor(Color.BLUE);
            g2d.fill(rec);
            g2d.translate(0, getHeight() / 2);
            g2d.setColor(brighten(Color.BLUE, 0.25));
            g2d.fill(rec);
            g2d.dispose();
        }
    }

    /**
     * Make a color brighten.
     *
     * @param color Color to make brighten.
     * @param fraction Darkness fraction.
     * @return Lighter color.
     */
    public static Color brighten(Color color, double fraction) {

        int red = (int) Math.round(Math.min(255, color.getRed() + 255 * fraction));
        int green = (int) Math.round(Math.min(255, color.getGreen() + 255 * fraction));
        int blue = (int) Math.round(Math.min(255, color.getBlue() + 255 * fraction));

        int alpha = color.getAlpha();

        return new Color(red, green, blue, alpha);

    }

}

答案 1 :(得分:6)

引用the docs

  

此方法将任意比例因子应用于此Color的三个RGB组件中的每一个,以创建此Color的更亮版本。

因此,假设Color.blue是颜色rgb(0, 0, 255),更明亮的方法会尝试:

  1. 0乘以比例因子,再次得到0;和
  2. 255乘以比例因子,由于加价会再次导致255
  3. 请注意 hue-saturation-value (其中“value”与“brightness”相同)颜色坐标模型与 hue-saturation- 亮度 模型,其行为更直观。 (参见HSL and HSV上的维基百科。)遗憾的是,Java没有内置的HSL计算,但您应该能够通过轻松搜索找到它们。