【发布时间】:2011-12-23 05:08:33
【问题描述】:
我正在编写一个应用程序,用户可以通过选择一种新颜色来更改屏幕上图像的颜色。我有一个简单的图像 - 只有 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
(我从来没有使用过动态颜色和图像,所以我有点不知所措。在此先感谢您的帮助。)
编辑:这是选择较深颜色后我想要的“之前”和“之后”图像:
【问题讨论】:
-
您是否限制了用户可以选择的颜色?您希望图像的哪些部分成为新颜色?
-
我认为他希望灰度图像颜色作为所选颜色的某种亮度。
-
是的,图像是灰度的,其中有 2 到 6 种灰度。我想调整所有这些阴影以反映所选颜色。
-
嗯,我的回答对你有帮助吗,有什么问题吗?