如果足以檢索點擊鼠標的像素的顏色,那麼您可以非常輕鬆地完成此操作。如果您知道圖像顯示在圖像視圖未縮放和未裁剪,那麼所有你需要的是:
imageView.setOnMouseClicked(e -> {
Color color = imageView.getImage().getPixelReader().getColor((int)e.getX(), (int)e.getY());
// ...
});
更一般地,你可能需要映射圖像視圖座標到圖像座標:
imageView.setOnMouseClicked(e -> {
double viewX = e.getX();
double viewY = e.getY();
double viewW = imageView.getBoundsInLocal().getWidth();
double viewH = imageView.getBoundsInLocal().getHeight();
Rectangle2D viewport = imageView.getViewport();
double imgX = viewport.getMinX() + e.getX() * viewport.getWidth()/viewW;
double imgY = viewport.getMinY() + e.getY() * viewport.getHeight()/viewH ;
Color color = imageView.getImage().getPixelReader().getColor((int)imgX, (int)imgY);
// ...
});
一旦你有了顏色,你可以做一些簡單的分析,看看它是否大致匹配圖像中各種項目的顏色,例如檢查hue
組件,或檢查固定顏色的「距離」是否適當小。
這方面的一個典型的實現可能看起來像:
// choose a color based on what is in your image:
private final Color FIELD_GREEN = Color.rgb(10, 10, 200);
private double distance(Color c1, Color c2) {
double deltaR = c1.getRed() - c2.getRed();
double deltaG = c1.getGreen() - c2.getGreen();
double deltaB = c1.getBlue() - c2.getBlue();
return Math.sqrt(deltaR * deltaR + deltaG * deltaG + deltaB * deltaB);
}
private boolean colorsApproximatelyEqual(Color c1, Color c2, double tolerance) {
return distance(c1, c2) < tolerance ;
}
並在處理程序後,你可以做
if (colorsApproximatelyEqual(color, FIELD_GREEN, 0.1)) {
// process click on field...
}
這是否是一種可行的方法取決於的性質圖像映射。如果地圖中的着色過於複雜(或者不容易用顏色區分對象),那麼您可能需要在場景圖中放置其他元素,並在每個元素上註冊處理程序,如問題中所述。
也許svg會幫助你嗎?檢查https:// stackoverflow。com/questions/40753613/javafx-button-with-svg –
對不起,我不太知道該怎麼辦 – Noralie
我該怎麼辦? – Noralie