6

java.awt.Color我试图使用提供的默认颜色创建更亮的颜色

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

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

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

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

2 回答 2

9

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

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

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 的事实

这将允许您强制颜色在变亮时接近白色,在变暗时接近黑色......

在此处输入图像描述

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);

    }

}
于 2013-09-06T00:57:26.060 回答
6

引用文档

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

因此,假设它Color.blue是 color rgb(0, 0, 255),更亮的方法将尝试:

  1. 将s乘以0比例因子,再次得到0s;和
  2. 将 乘以255一个比例因子,这又是由于上限导致的结果255

请注意,色调饱和度值(其中“值”与“亮度”相同)颜色坐标模型与色调饱和度亮度模型不同,后者的行为更加直观。(请参阅有关HSL 和 HSV的Wikipedia 。)不幸的是,Java 没有内置 HSL 计算,但您应该能够通过搜索轻松找到这些计算。

于 2013-09-06T00:47:37.953 回答