如何根据用户操作更改图标的颜色? [英] How to change the color of an icon based on user action?
问题描述
我在写一个应用程序,用户可以通过选择一种新的颜色来改变屏幕上的图像颜色。我有一个简单的图片 - 只有40x40 - 像这样:
I am writing an application where the user can change the color of the image on screen by choosing a new color. I have a simple image - only 40x40 - like this:
我已经尝试过很多事情:像素替换,ColorModel,RGBFilter等等。我无法想象这个图像的东西出来。在尝试的过程中,我学习了BufferedImage,我可以得到.png的格式,并显示在屏幕上。我可以使用像素替换将形状变成一个实心的颜色块,但结果是可怕的。
I have tried many things: pixel replacement, ColorModel, RGBFilter, etc. I can't figure this image stuff out. In the process of trying, I have learned about BufferedImage and I can get the .png's into that format and displayed on screen. I can turn the shape into a solid blob of color using pixel replacement, but the results are horrible.
从我收集的,我想使用ColorModel或过滤,但我被骗了。这里是一个简单的应用程序,演示我在哪里。
From what I've gleaned, I want to use a ColorModel or Filter, but I am stumped. Here is a simple app that demonstrates where I am.
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
编辑:这是一个之前和之后的图像我想在选择较暗的颜色后:
Here is a "before" and "after" image of what I would like after a darker color is chosen:
推荐答案
也许有一个更优雅和高效的版本,但如果你有一个BufferedImage你可以尝试像:
Perhaps there is a more elegant and efficient version but if you have a BufferedImage you could try something like:
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());
}
也许这是真正的问题:混合两种颜色可以通过乘...
Maybe this is the real problem: Mixing the two colors can be done by multiplying them...
编辑:
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]);
}
这篇关于如何根据用户操作更改图标的颜色?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!