JavaFX中无缩放效果的视口方法

JavaFX中无缩放效果的视口方法,javafx,javafx-8,zooming,viewport,effect,Javafx,Javafx 8,Zooming,Viewport,Effect,我正在尝试将一幅图像切片以显示在屏幕上。 例如,如果我将左侧花朵图片的右边缘更改为20,将右侧花朵图片的下边缘更改为20,则它们的行为应如下所示: (原始图片显示在第一列中) ViewPort方法完全符合我的要求,剪切图像并保留空白,但它使用图像的原始大小显示缩放效果,如javafx网站中所述: 将矩形视口插入图像。在缩放或任何其他变换之前,视口在图像坐标中指定。 如果视口为空,则显示整个图像。如果视口为非空,则仅显示位于视口内的图像部分。如果图像未完全覆盖视口,则视口的任何剩余区域都将为空。

我正在尝试将一幅图像切片以显示在屏幕上。 例如,如果我将左侧花朵图片的右边缘更改为20,将右侧花朵图片的下边缘更改为20,则它们的行为应如下所示:

(原始图片显示在第一列中)

ViewPort方法完全符合我的要求,剪切图像并保留空白,但它使用图像的原始大小显示缩放效果,如javafx网站中所述:

将矩形视口插入图像。在缩放或任何其他变换之前,视口在图像坐标中指定。 如果视口为空,则显示整个图像。如果视口为非空,则仅显示位于视口内的图像部分。如果图像未完全覆盖视口,则视口的任何剩余区域都将为空。”

在设置视口之前,我已经尝试过使用
imageView.resize(屏幕宽度、屏幕高度)
,但它不起作用。
还尝试了
imageView.setFitWidth(屏幕宽度)、imageView.setFitWidth(屏幕高度)

是否可以重新缩放图像,使其按说明显示? 或者其他的工作

以下是我的左边距代码示例:
mediaContent.resize(screenWidth,screen.getHeight());
//mediaContent.setFitWidth(屏幕宽度);
//setFitHeight(screen.getHeight());
setViewport(新的矩形2D(ScreenWidthDXLeft,0,screenWidth,screen.getHeight());

更新:尝试按建议设置
setFitWidth
setfithheight
静态显示放大的图像

    `imageView.setFitWidth(space.getX());
    imageView.setFitHeight(space.getY());
    imageView.setViewport(new Rectangle2D(screen.getWidth()-space.getX(), 0, screen.getWidth(), screen.getHeight()));
    imageView.setFitWidth(space.getX());
    imageView.setFitHeight(space.getY());

    return imageView;`
这是我在不使用时使用
setViewport
方法的结果 设置边距:

不设置边距时应如何设置:

更新2:示例(从java buddy修改)放大

package javafx_imageview_viewport;

import javafx.application.Application;
import javafx.beans.value.ObservableValue;
import javafx.geometry.Rectangle2D;
import javafx.scene.Scene;
import javafx.scene.control.Slider;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

/**
 * @web http://java-buddy.blogspot.com/
 */
public class JavaFX_ImageView_Viewport extends Application {

@Override
public void start(Stage primaryStage) {

    ImageView imageView1 = new ImageView(new Image("https://i.imgur.com/6Zl0eQB.jpg"));
    imageView1.setFitWidth(150);
    imageView1.setFitHeight(100);

    //Example to rotate ImageView
    Image image2 = new Image("https://i.imgur.com/6Zl0eQB.jpg");
    Rectangle2D viewportRect2 = new Rectangle2D(
            image2.getWidth()/4, 
            image2.getHeight()/4, 
            image2.getWidth()*3/4, 
            image2.getHeight()*3/4);
    ImageView imageView2 = new ImageView(image2);
    imageView2.setFitWidth(150);
    imageView2.setFitHeight(100);
    imageView2.setViewport(viewportRect2);

    Slider sliderRotate = new Slider();
    sliderRotate.setMin(0);
    sliderRotate.setMax(360);
    sliderRotate.setValue(0);
    sliderRotate.valueProperty().addListener(
            (ObservableValue<? extends Number> observable, 
                    Number oldValue, Number newValue) -> {
        imageView2.setRotate((double)newValue);
    });

    //Example to change ViewPort
    Image image3 = new Image("https://i.imgur.com/6Zl0eQB.jpg");
    Rectangle2D viewportRect3 = new Rectangle2D(
            0, 
            0, 
            image3.getWidth(), 
            image3.getHeight());
    ImageView imageView3 = new ImageView(image3);
    imageView3.setFitWidth(150);
    imageView3.setFitHeight(100);
    imageView3.setViewport(viewportRect3);

    Slider sliderViewPort = new Slider();
    sliderViewPort.setMin(0);
    sliderViewPort.setMax(1.0);
    sliderViewPort.setValue(1.0);
    sliderViewPort.valueProperty().addListener(
            (ObservableValue<? extends Number> observable, 
                    Number oldValue, Number newValue) -> {
        Rectangle2D newViewportRect3 = new Rectangle2D(
                0,
                0,
                (double)newValue*image3.getWidth(),
                (double)newValue*image3.getHeight());
        imageView3.setViewport(newViewportRect3);
    });


    VBox vBox = new VBox();
    vBox.getChildren().addAll(imageView1, 
            imageView2, sliderRotate,
            imageView3, sliderViewPort);

    StackPane root = new StackPane();
    root.getChildren().add(vBox);

    Scene scene = new Scene(root, 300, 350);

    primaryStage.setTitle("java-buddy: ImageVIew ViewPort");
    primaryStage.setScene(scene);
    primaryStage.show();
}

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    launch(args);
}    
}
package javafx\u imageview\u视口;
导入javafx.application.application;
导入javafx.beans.value.observeValue;
导入javafx.geometry.Rectangle2D;
导入javafx.scene.scene;
导入javafx.scene.control.Slider;
导入javafx.scene.image.image;
导入javafx.scene.image.ImageView;
导入javafx.scene.layout.StackPane;
导入javafx.scene.layout.VBox;
导入javafx.stage.stage;
/**
*@webhttp://java-buddy.blogspot.com/
*/
公共类JavaFX_ImageView_Viewport扩展了应用程序{
@凌驾
公共无效开始(阶段primaryStage){
ImageView imageView1=新图像视图(新图像(“https://i.imgur.com/6Zl0eQB.jpg"));
imageView1.setFitWidth(150);
图像视图1.设置高度(100);
//旋转ImageView的示例
图像image2=新图像(“https://i.imgur.com/6Zl0eQB.jpg");
Rectangle2D视口Rect2=新的Rectangle2D(
image2.getWidth()/4,
图2.getHeight()/4,
图2.getWidth()*3/4,
图2.getHeight()*3/4);
ImageView imageView2=新的ImageView(image2);
imageView2.setFitWidth(150);
图像视图2.安装高度(100);
imageView2.setViewport(viewportRect2);
Slider sliderRotate=新滑块();
sliderRotate.setMin(0);
sliderRotate.setMax(360);
sliderRotate.setValue(0);
sliderRotate.valueProperty().addListener(

(观察值看来我想要的东西没有意义

如果我想让图像适合屏幕,我必须使用
fitScreenWidth(screenWidth)
fitScreenHeight(screenHeight)
,但在这种情况下,使用
viewPort
方法没有意义,因为图像已经调整了大小


viewPort方法只能用于原始图像的尺寸。

您应该调用
setFitWidth
setFitWidth
,以显示图像部分的尺寸(而不是屏幕尺寸).在调用
setViewport
方法之前或之后?我认为这无关紧要。它仍然显示在Post a中放大的图像。除了您之外,没有人知道要传递给这些方法的值。
package javafx_imageview_viewport;

import javafx.application.Application;
import javafx.beans.value.ObservableValue;
import javafx.geometry.Rectangle2D;
import javafx.scene.Scene;
import javafx.scene.control.Slider;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

/**
 * @web http://java-buddy.blogspot.com/
 */
public class JavaFX_ImageView_Viewport extends Application {

@Override
public void start(Stage primaryStage) {

    ImageView imageView1 = new ImageView(new Image("https://i.imgur.com/294AEFU.png"));

    //Example to rotate ImageView
    Image image2 = new Image("https://i.imgur.com/294AEFU.png");
    Rectangle2D viewportRect2 = new Rectangle2D(
            image2.getWidth()/4, 
            image2.getHeight()/4, 
            image2.getWidth()*3/4, 
            image2.getHeight()*3/4);
    ImageView imageView2 = new ImageView(image2);
    imageView2.setViewport(viewportRect2);

    Slider sliderRotate = new Slider();
    sliderRotate.setMin(0);
    sliderRotate.setMax(360);
    sliderRotate.setValue(0);
    sliderRotate.valueProperty().addListener(
            (ObservableValue<? extends Number> observable, 
                    Number oldValue, Number newValue) -> {
        imageView2.setRotate((double)newValue);
    });

    //Example to change ViewPort
    Image image3 = new Image("https://i.imgur.com/294AEFU.png");
    Rectangle2D viewportRect3 = new Rectangle2D(
            0, 
            0, 
            image3.getWidth(), 
            image3.getHeight());
    ImageView imageView3 = new ImageView(image3);
    imageView3.setViewport(viewportRect3);

    Slider sliderViewPort = new Slider();
    sliderViewPort.setMin(0);
    sliderViewPort.setMax(1.0);
    sliderViewPort.setValue(1.0);
    sliderViewPort.valueProperty().addListener(
            (ObservableValue<? extends Number> observable, 
                    Number oldValue, Number newValue) -> {
        Rectangle2D newViewportRect3 = new Rectangle2D(
                0,
                0,
                (double)newValue*image3.getWidth(),
                (double)newValue*image3.getHeight());
        imageView3.setViewport(newViewportRect3);
    });


    VBox vBox = new VBox();
    vBox.getChildren().addAll(imageView1, 
            imageView2, sliderRotate,
            imageView3, sliderViewPort);

    StackPane root = new StackPane();
    root.getChildren().add(vBox);

    Scene scene = new Scene(root, 300, 350);

    primaryStage.setTitle("java-buddy: ImageVIew ViewPort");
    primaryStage.setScene(scene);
    primaryStage.show();
}

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    launch(args);
}

}