我尝试使用java.awt.Color
提供的默认颜色
但是当我使用2种颜色绘制时,它们看起来是一样的吗?
Color blue = Color.BLUE;
Color brighterBlue = blue.brighter();
test.setColor(blue);
test.fillCircle(size);
test.setColor(brighterBlue);
test.drawCircle(size);
答案 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
的事实这将允许你强制颜色接近白色,变亮,黑色变暗;
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)
,更明亮的方法会尝试:
0
乘以比例因子,再次得到0;和255
乘以比例因子,由于加价会再次导致255
。请注意 hue-saturation-value (其中“value”与“brightness”相同)颜色坐标模型与 hue-saturation- 亮度 模型,其行为更直观。 (参见HSL and HSV上的维基百科。)遗憾的是,Java没有内置的HSL计算,但您应该能够通过轻松搜索找到它们。