2017-10-31 25 views
0

画像をスライスして画面に表示しようとしています。 たとえば、右側の余白を20の右の花の写真の左と下の余白を20に変更すると、次のように動作するはずです。JavaFXでズームエフェクトのないViewPortメソッド

(元の画像は最初の画像が最初に表示されます列) enter image description here

ビューポートの方法は、私は、画像をカットし、空のマージンを残して、欲しいものを正確に行いますが、それはJavaFXのウェブサイトで述べているように、ズーム効果を表示する画像の元のサイズを使用しています。

「長方形のビューポートビューポートは、スケーリングまたは他のトランスの前に、画像の座標で指定されます形成。 ビューポートがnullの場合、画像全体が表示されます。ビューポートがnullでない場合、ビューポート内に収まる画像の部分だけが表示されます。画像が完全にビューポートをカバーしていない場合は、ビューポートの任意の残りの領域は、私はすでにビューポートを設定する前にimageView.resize(screenWidth, screenHeight)を使用しようとした

「。空になりますが、それは動作しません。
imageView.setFitWidth(screenWidth), imageView.setFitHeight(screenHeight)
に試してみました?説明するように表示されますので、 またはその他の回避策画像を再スケーリングすることが可能である。ここ

は、左余白のための私のコードでは、例として次のとおりです。?
mediaContent.resize(screenWidth, screen.getHeight()); // mediaContent.setFitWidth(screenWidth); // mediaContent.setFitHeight(screen.getHeight()); mediaContent.setViewport(new Rectangle2D(screenWidth-dXLeft, 0, screenWidth, screen.getHeight()));

更新:試しまし示唆した静止画としてsetFitWidthsetFitHeightを設定することが

`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メソッドを使用する場合、これは結果である:それは時にあるべきenter image description here

方法マージンを設定しない:enter image description here

更新2:例(java-buddyから変更)ズーム私はそれが画像をカット、動作するようにする方法のjava-バディから

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); 
}  
} 

例2に:

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); 
} 

} 
+0

'setFitWidth'と' setFitHeight'は、表示したい画像の部分の大きさで呼び出すべきです(画面の大きさではありません)。 –

+0

'setViewport'メソッドを呼び出す前後に? –

+0

私はそれが重要だとは思わない。 –

答えて

0

私が望んでいたことは意味がないようです。

画像を画面に合わせたい場合は、fitScreenWidth(screenWidth)fitScreenHeight(screenHeight)を使用する必要がありますが、画像がすでにサイズ変更されているため、viewPortメソッドを使用することは意味がありません。

viewPortメソッドは、元の画像の寸法でのみ使用してください。

関連する問題