java Javafx图像根据鼠标悬停位置进行裁剪
我正在开发一个追踪程序,将点放在X射线的解剖点上。我的问题是,我试图放大我的X光图像(Imageview
),而我的鼠标悬停在它上面,并在另一个Imageview
中显示。我希望我的鼠标在其周围创建一个虚拟矩形,并在移动时保持在中心位置,并将该实时图像传输到其他小Imageview
,到目前为止,我已经这样做了,但存在一些小问题。我的长方形跟不上我的鼠标,当我移动到角落时,故障会加速,你有什么建议?我正在分享我的错误和代码,以澄清所有这些事情
也许我应该创建一个矩形,并将其放置在鼠标位置周围,实时裁剪图像,放入zoomedImageview
中,并一直显示,但我被困在了这一点上
主要问题是,鼠标位置和zoomedImageview
的中心位置必须始终重合
X射线图像视图的宽度和高度为800x800 ZoomMedimageView Fitwidth高度为250x250
public class DrawingController {
@FXML
ImageView xrayImage;
@FXML
ImageView zoomedImage;
public void initialize()
{
xrayImage.setOnMouseMoved(e -> { //HOVERING ON XRAY
PixelReader reader = XrayImageview.getImage().getPixelReader();
WritableImage newImage = new WritableImage(reader,
(int) e.getX(), //x and y is picked according to hovering mouse position
(int) e.getY(),
(int) 250, // 250x250 rectangle is requested.
(int) 250);
zoomedImage.setImage(newImage); // Displaying zoomed image
});
}}
我的FXML文件是:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.image.Image?>
<?import javafx.scene.image.ImageView?>
<?import javafx.scene.layout.AnchorPane?>
<AnchorPane prefHeight="913.0" prefWidth="1238.0" xmlns="http://javafx.com/javafx/16" xmlns:fx="http://javafx.com/fxml/1" fx:controller="main.java.controllers.DrawingController">
<children>
<ImageView fitHeight="800.0" fitWidth="800.0" layoutX="418.0" layoutY="33.0" pickOnBounds="true" preserveRatio="true" fx:id="xrayImage">
<image>
<Image url="@threatCare.png" />
</image>
</ImageView>
<ImageView fx:id="zoomedImage" fitHeight="250.0" fitWidth="250.0" layoutX="108.0" layoutY="433.0" pickOnBounds="true" preserveRatio="true" />
</children>
</AnchorPane>
主要课程是:
package main.java;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.layout.AnchorPane;
import javafx.stage.Stage;
import main.java.database.DatabaseCreator;
import javax.swing.text.html.ImageView;
import java.awt.*;
public class Runner extends Application {
@Override
public void start(Stage primaryStage) throws Exception{
Parent root = FXMLLoader.load(getClass().getResource("../resources/DrawingPanel.fxml"));
primaryStage.setTitle("TreatCare Software Systems");
Scene scene = new Scene(root,1200,950);
primaryStage.setScene(scene);
primaryStage.setMinWidth(1200);
primaryStage.setMinHeight(950);
primaryStage.setMaximized(true);
primaryStage.setOnCloseRequest( e -> SystemClose());
primaryStage.show();
}
private void SystemClose(){
System.exit(0);
}
public static void main(String[] args){
launch(args);
}
}
# 1 楼答案
我在^{中添加了一个窗格。这个
Pane
的目的是显示被种植区域的边界(一个标记):控制器添加和更新标记,并更新裁剪后的图像。我从VGR's answer中借用了一些代码来处理这个比例,但请注意使用
getLayoutBounds()
来计算这个比例:使用
# 2 楼答案
您正在缩放图像,因此需要根据该缩放转换鼠标坐标
从你的。fxml文件:
该行中有三个属性用于缩放图像:
fitWidth="800.0"
将图像缩放到800像素宽fitHeight="800.0"
将图像缩放到800像素高preserveRatio="true"
-覆盖所有缩放,因此图像在两个维度上始终具有相同的缩放比例所以你需要根据以下公式乘以鼠标坐标: