gpt4 book ai didi

java - 如何根据用户操作更改图标的颜色?

转载 作者:行者123 更新时间:2023-12-02 22:44:49 27 4
gpt4 key购买 nike

我正在编写一个应用程序,用户可以通过选择新颜色来更改屏幕上图像的颜色。我有一个简单的图像 - 只有 40x40 - 像这样: Character Head

我尝试了很多东西:像素替换、ColorModel、RGBFilter 等。我无法弄清楚这个图像的内容。在尝试的过程中,我了解了 BufferedImage,并且可以将 .png 转换为该格式并显示在屏幕上。我可以使用像素替换将形状变成实心颜色 Blob ,但结果很糟糕。

根据我收集的信息,我想使用 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

(我从未使用过动态颜色和图像,所以我无法理解。提前感谢您的帮助。)

编辑:这是选择较暗颜色后我想要的“之前”和“之后”图像:

enter image description here enter image description here

最佳答案

也许有一个更优雅、更高效的版本,但如果你有 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]);
}

关于java - 如何根据用户操作更改图标的颜色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8029903/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com