【问题标题】:Javafx: How to set a scaled image as a node backgroundJavafx:如何将缩放图像设置为节点背景
【发布时间】:2018-08-14 14:46:03
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

    显然,这绕过了 CSS,但也许它就足够了,并且可以让您实现所需的缩放。

    【讨论】:

    • 哦,另外,您需要将堆栈窗格的宽度/高度绑定到场景的宽度/高度。
    【解决方案2】:

    我需要做的就是删除我的 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 字段的值传递将提供与使用Image.SCALE_SMOOTHgetScaledInstance 相似的质量图像。 然后(正如@kylejmcintyre 提到的)您可以将javafx.scene.image.Image 传递给ImageView 对象并将其添加到您的根Pane

    【讨论】:

      【解决方案3】:

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

      创建根节点

      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 保持活力

      【讨论】:

        猜你喜欢
        • 2019-09-02
        • 2016-10-03
        • 2020-05-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-23
        • 2016-12-22
        • 1970-01-01
        相关资源
        最近更新 更多