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

时间:2014-07-02 22:47:55

标签: java css image javafx-2 image-quality

我有一个简单的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内联它?

我知道,因为我只能调整原始图像的大小并导入该图像,但是我想知道我想做什么是可能的。

3 个答案:

答案 0 :(得分:1)

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

显然这会绕过CSS,但也许它足以让你实现你想要的缩放。

答案 1 :(得分:1)

我需要做的就是删除我的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,但使用this javafx.scene.image.Image constructor

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

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

答案 2 :(得分:0)

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

创建根节点

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生命力