繁体   English   中英

Javafx:如何将缩放图像设置为节点背景

[英]Javafx: How to set a scaled image as a node background

我有一个简单的JavaFX程序,该程序使用图像作为主Pane上的背景。 目前,我直接在.css文件中加载图像:

.pane {
  -fx-background-image: url('map.png');
  -fx-background-size: 1000 800;
}

这可以正常工作,但是-fx-background-size生成的图像质量很差。

相反,我想将java.awt.Image#getScaledInstanceImage.SCALE_SMOOTH (或等效的JavaFX)一起使用,这会生成质量更高的图像。

我可以直接使用getScaledInstance并以某种方式将Java awt图像传递到css文件吗? 还是将其与setStyle内联?

我知道,由于仅可以调整该图像的大小,因此我可以调整原始图像的大小并将其导入,但是我想知道我想做的事是否可行。

您可以使用StackPane作为Scene的根节点,然后将ImageView的实例放在堆栈的底部,并使用透明背景色(用CSS或以编程方式定义)将您以前用作根的任何内容放在其顶部)。

显然,这可以绕过CSS,但也许足以满足您的需要,并且可以实现所需的缩放比例。

我要做的就是删除CSS,然后简单地执行以下操作:

Pane root = new Pane();
ImageView background = new ImageView(new Image("map.png", 1000, 800, false, true));
root.getChildren().add(background);

这是因为等效于java.awt.Image#getScaledInstance的JavaFX仅位于javafx.scene.image.Image的构造函数中。

虽然您不能使用java.awt.Image代替javafx.scene.image.Image ,但是使用javafx.scene.image.Image构造函数

Image(String url, double width, double height, boolean preserveRatio, boolean smooth)

并传递true作为smooth字段的值,将使用Image.SCALE_SMOOTHgetScaledInstance类似的质量图像。 然后(如@kylejmcintyre所述),您可以将javafx.scene.image.Image传递给ImageView对象,并将其添加到根Pane

确保调整窗口/舞台大小时的一致性。 这就是我所做的

创建一个根节点

BorderPane root = new BorderPane();

获取主屏幕

Screen screen = Screen.getPrimary();

设置屏幕的可见边界

Rectangle2D bounds = screen.getVisualBounds();
double width = bounds.getWidth();
double height = bounds.getHeight();

设置与屏幕尺寸相同的背景图像。 调整屏幕大小时,由于将图像的宽度和高度设置为当前屏幕大小,因此背景图像也将调整大小。

BackgroundImage bImage = new BackgroundImage(new 
Image("url here",width,height,false,true),
    BackgroundRepeat.REPEAT, BackgroundRepeat.NO_REPEAT, BackgroundPosition.DEFAULT,
      BackgroundSize.DEFAULT);

root.setBackground(new Background(bImage));

通过显示测试程序

stage.setTitle("Title here);
stage.setScene(new Scene(root));
stage.show();

希望对您有所帮助。 使Java保持活力

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM