如何将图像转换为 Java 中的形状?

How to convert an image into a shape in Java?

我目前正在从事一个教学生如何与股票市场互动的股票市场项目。我现在正在处理的一个问题围绕着效率和内存的问题。我在 adobe illustrator 中制作了所有 2D 图标 (例如设置图标、投资组合图标等),我将这些文件导出为 png 文件,然后将它们放入我的程序中。我目前使用 JavaFX,JavaFX 的一个特性是所谓的 imageView,它是一种处理图像打开和查看的方法。

假设用户想在游戏中按下 设置 图标,当用户按下时,我想将设置图标更改为更深或更浅的颜色为了给用户提供更好的用户体验 (UX) 将鼠标悬停在该图标上,我使用了两张不同的图片,然后从框架中删除一张,然后用另一张替换,这是非常低效的。

我知道JavaFX有一个Shape class继承了很多方法比如Fill,或者setFill,但是这些方法只能影响 Shape class.

我的问题是,"How can I convert an image that is imported into the project, into something that I can use methods such as setFill and Fill on"

如果您只是想进行基本的更改,例如使您的图标变暗或变亮,您可以查看 javaFx 的效果部分,您可以阅读它 here,或者您可以导入您的图像作为评论中建议的 SVG

如果您打算使用 Effects 来实现,您可以使用 ColorAdjust Effect 将亮度值设置为负值(ColorAdjust 中的亮度范围在 -1 和 +1 之间)来实现悬停时变暗的效果其中 0 是默认值),如以下示例所示

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.effect.ColorAdjust;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class Main extends Application {
    @Override
    public void start(Stage s) {
        ImageView image = new ImageView(new Image("img.png"));

        ColorAdjust darker = new ColorAdjust();
        darker.setBrightness(-.3);

        image.setOnMouseEntered(e-> {
            image.setEffect(darker);
        });

        image.setOnMouseExited(e-> {
            image.setEffect(null);
        });

        s.setScene(new Scene(new StackPane(image)));
        s.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}    

更改图像的颜色可能涉及使用 ColorAdjust 通过设置色相值来调整色相

ColorAdjust hueShift = new ColorAdjust();
hueShift.setHue(-.3);

image.setOnMouseEntered(e-> {
    image.setEffect(hueShift);
});

image.setOnMouseExited(e-> {
    image.setEffect(null);
});

您可以通过将效果设置为其他效果的输入来组合效果,例如,如果您想同时使节点变暗并对其进行模糊,您可以将模糊效果设置为变暗颜色调整的输入

GaussianBlur blur = new GaussianBlur();
blur.setRadius(10);

ColorAdjust darker = new ColorAdjust();
darker.setBrightness(-.3);

darker.setInput(blur);

image.setOnMouseEntered(e-> {
    image.setEffect(darker);
});

image.setOnMouseExited(e-> {
    image.setEffect(null);
});