簡體   English   中英

如何根據用戶操作更改圖標的顏色?

[英]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]);
}

如果你知道你事先想要的顏色,你可以使用一個LookupOpLookupTable 使用Java 2D LookupOp過濾器類處理圖像使用Java 2D進行圖像處理中可以找到示例。

如果不是, darker()getHSBColor()可以有用,如圖這里的背景下BufferedImage

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM