java.awt.Color
我试图使用提供的默认颜色创建更亮的颜色
但是当我使用 2 种颜色绘制时,它们看起来是一样的吗?
Color blue = Color.BLUE;
Color brighterBlue = blue.brighter();
test.setColor(blue);
test.fillCircle(size);
test.setColor(brighterBlue);
test.drawCircle(size);
java.awt.Color
我试图使用提供的默认颜色创建更亮的颜色
但是当我使用 2 种颜色绘制时,它们看起来是一样的吗?
Color blue = Color.BLUE;
Color brighterBlue = blue.brighter();
test.setColor(blue);
test.fillCircle(size);
test.setColor(brighterBlue);
test.drawCircle(size);
有很多方法可以解决这个问题。
最明显的方法是向现有颜色值添加分数,例如...
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);
}
}
引用文档:
此方法将任意比例因子应用于此颜色的三个 RGB 分量中的每一个,以创建此颜色的更亮版本。
因此,假设它Color.blue
是 color rgb(0, 0, 255)
,更亮的方法将尝试:
0
比例因子,再次得到0s;和255
一个比例因子,这又是由于上限导致的结果255
。请注意,色调饱和度值(其中“值”与“亮度”相同)颜色坐标模型与色调饱和度亮度模型不同,后者的行为更加直观。(请参阅有关HSL 和 HSV的Wikipedia 。)不幸的是,Java 没有内置 HSL 计算,但您应该能够通过搜索轻松找到这些计算。