Search code examples
image-processingjavafx-2

How to change color of image in JavaFX


I have a PNG image like this:

png image

I want to change image to something like this:

enter image description here

How can I do this in JavaFX?


Solution

  • As you don't care if it is a vector shape or a bitmap, I'll just outline solutions using a bitmap here. If you actually wanted a vector shape, I believe you would need to work with vector input to get a good result.


    Use a ColorAdjust effect with the brightness set to minimum (-1). Cache the result for SPEED.

    speed

    Here is a sample which creates a shadow outline of an image:

    import javafx.application.Application;
    import javafx.scene.*;
    import javafx.scene.effect.ColorAdjust;
    import javafx.scene.image.*;
    import javafx.stage.Stage;
    
    public class Shadow extends Application {
        @Override 
        public void start(Stage stage) throws Exception {
            ImageView imageView = new ImageView(
                new Image(
                    "https://i.sstatic.net/jbT1H.png"
                )
            );
    
            ColorAdjust blackout = new ColorAdjust();
            blackout.setBrightness(-1.0);
    
            imageView.setEffect(blackout);
            imageView.setCache(true);
            imageView.setCacheHint(CacheHint.SPEED);
    
            stage.setScene(new Scene(new Group(imageView)));
            stage.show();
        }
    
        public static void main(String[] args) {
            Application.launch();
        }
    }
    

    Here is another sample which adjusts the color of an image, hover over smurfette to make her blush.

    smurfette blushing smurfette

    import javafx.application.Application;
    import javafx.beans.binding.Bindings;
    import javafx.scene.*;
    import javafx.scene.effect.*;
    import javafx.scene.image.*;
    import javafx.scene.paint.Color;
    import javafx.stage.Stage;
    
    public class Shadow extends Application {
        @Override
        public void start(Stage stage) throws Exception {
            Image image = new Image(
                    "http://icons.iconarchive.com/icons/designbolts/smurfs-movie/128/smurfette-icon.png"
            );
    
            ImageView imageView = new ImageView(image);
            imageView.setClip(new ImageView(image));
    
            ColorAdjust monochrome = new ColorAdjust();
            monochrome.setSaturation(-1.0);
    
            Blend blush = new Blend(
                    BlendMode.MULTIPLY,
                    monochrome,
                    new ColorInput(
                            0,
                            0,
                            imageView.getImage().getWidth(),
                            imageView.getImage().getHeight(),
                            Color.RED
                    )
            );
    
            imageView.effectProperty().bind(
                    Bindings
                        .when(imageView.hoverProperty())
                            .then((Effect) blush)
                            .otherwise((Effect) null)
            );
    
            imageView.setCache(true);
            imageView.setCacheHint(CacheHint.SPEED);
    
            stage.setScene(new Scene(new Group(imageView), Color.AQUA));
            stage.show();
        }
    
        public static void main(String[] args) {
            Application.launch();
        }
    }