有很多方法可以解决这个问题。
最明显的方法是向现有的颜色值添加一个分数,例如...
int red = 128
float fraction = 0.25f
red = red + (red * float)
相反,你可以对颜色应用负载因子。我们知道颜色元素的最大值为255,因此,你不必试图增加颜色因子本身,而是可以将颜色元素按整个颜色范围的因子增加,例如
int red = 128
float fraction = 0.25f
red = red + (255 * fraction)
基本上,这将通过255倍增加颜色元素......有点俏皮。现在我们还需要考虑到颜色永远不应大于255的事实。
这将允许您在变亮时强制颜色接近白色,在变暗时接近黑色......
![输入图像描述](https://istack.dev59.com/zQvNQ.webp)
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();
}
}
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);
}
}
Color.brighter()
所执行的数学运算实际上是增加了颜色在 HSV 空间中的 值,这与它离白色有多近没有太大关系,它只是意味着它是最“蓝”的蓝色。 (HSV 的值轴几乎是极其愚蠢的。)HSL 更好一些,但仍然存在一个问题,即相同饱和度和亮度的蓝色看起来比黄色更暗。 - millimoose