[英]How to change the color of an icon based on user action?
我正在编写一个应用程序,用户可以通过选择新颜色来更改屏幕上图像的颜色。 我有一个简单的图片-只有40x40-像这样:
我尝试了很多事情:像素替换,ColorModel,RGBFilter等。我无法弄清楚该图像的内容。 在尝试过程中,我了解了BufferedImage,可以将.png转换为该格式并显示在屏幕上。 我可以使用像素替换将形状变成纯色的斑点,但结果令人震惊。
从我收集到的信息来看,我想使用ColorModel或Filter,但是我很困惑。 这是一个演示我在哪里的简单应用。
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JColorChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class ChangeImageColor {
public static void main(String[] args) {
final ChangeColor cc = new ChangeColor();
java.awt.EventQueue.invokeLater( new Runnable() { @Override
public void run() { cc.setVisible( true ); }}
); // invokeLater
} // main
} // ChangeImageColor
class ChangeColor extends JFrame {
String CHAR_HEAD = "res/images/char/Head.png";
JLabel imageHead = new JLabel( new ImageIcon( CHAR_HEAD ) );
JButton buttonChoose = new JButton( "Choose Color" );
public ChangeColor() {
this.setSize( 200, 200 );
this.setLayout( new BorderLayout() );
buttonChoose.addActionListener( listenerButton );
this.add( imageHead, BorderLayout.CENTER );
this.add( buttonChoose, BorderLayout.SOUTH );
} // constructor
ActionListener listenerButton = new ActionListener() {
@Override public void actionPerformed( ActionEvent event ) {
Color newColor = JColorChooser.showDialog( null, "Choose Color", Color.RED );
ImageIcon icon = new ImageIcon( CHAR_HEAD );
System.out.println( "~" + newColor );
// *****************
// insert code to change color of Head.png to shades of chosen color
// *****************
imageHead.setIcon( icon );
} // actionPerformed
};
} // class
(我从未使用过动态色彩和图像,因此我不敢理会。在此先感谢您的帮助。)
编辑:这是选择较深颜色后我想要的“之前”和“之后”图像:
也许有一个更优雅,更有效的版本,但是如果您有BufferedImage,则可以尝试以下操作:
BufferedImage image;
for(int y = 0; y < image.getHeight(); y++)
for(int x = 0; x < image.getWidth(); x++)
{
Color imageColor = new Color(image.getRGB(x, y));
//mix imageColor and desired color
image.setRGB(x, y, imageColor.getRGB());
}
也许这是真正的问题:将两种颜色相乘可以将它们相乘...
编辑:
private Color multiply(Color color1, Color color2)
{
float[] color1Components = color1.getRGBComponents(null);
float[] color2Components = color2.getRGBColorComponents(null);
float[] newComponents = new float[3];
for(int i = 0; i < 3; i++)
newComponents[i] = color1Components[i] * color2Components[i];
return new Color(newComponents[0], newComponents[1], newComponents[2],
color1Components[3]);
}
如果你知道你事先想要的颜色,你可以使用一个LookupOp
用LookupTable
。 在使用Java 2D LookupOp过滤器类处理图像和使用Java 2D进行图像处理中可以找到示例。
如果不是, darker()
或getHSBColor()
可以有用,如图这里的背景下BufferedImage
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.