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