Как я могу поместить изображение в форму, не теряя его соотношения сторон?

#java #javafx

Вопрос:

Я хочу выбрать изображение с компьютера и поместить его в круг (JavaFX), но оно продолжает изменять соотношение сторон до 1:1, и я не знаю, что делать, может быть, есть другой способ сделать это, но я не так много знаю о JavaFX, и я больше ничего здесь не нашел.

Имея это изображение с соотношением сторон 4:3, оно изменяет соотношение сторон на 1:1 (это).

Вот код метода «onClick» :

 @FXML
public void handleUploadImage(MouseEvent event) {
    FileChooser fileChooser = new FileChooser();

    //Extensiones soportadas de imagen
    FileChooser.ExtensionFilter extFilterjpg
            = new FileChooser.ExtensionFilter("jpg files (*.jpg)", "*.jpg");
    FileChooser.ExtensionFilter extFilterpng
            = new FileChooser.ExtensionFilter("png files (*.png)", "*.png");
    FileChooser.ExtensionFilter extFilterjpeg
            = new FileChooser.ExtensionFilter("jpeg files (*.jpeg)", "*.jpeg");

    fileChooser.getExtensionFilters().addAll(extFilterjpg, extFilterpng, extFilterjpeg);
    //Menu de seleccion de imagen
    File file = fileChooser.showOpenDialog(null);

    Image image  = new Image(file.toURI().toString());
    circleImage.setFill(new ImagePattern(image, circleImage.getCenterX()-circleImage.getRadius(), circleImage.getCenterY()-circleImage.getRadius(), 2*circleImage.getRadius(), 2*circleImage.getRadius(), false)); //circleImage.setFill(new ImagePattern(image)); -> do the exact same thing
}
 

Ответ №1:

Я вижу 2 решения, возможно, не такие простые, как вы должны ожидать.

1 — Сначала создайте квадратное изображение по центру

 Image square(Image img) {
    if (img.getHeight() == img.getWidth()) {
        return img;
    }
    // Smallest length
    int size = (int) (img.getWidth() > img.getHeight() ? img.getHeight() : img.getWidth());
    // left shift
    int x = ((int) img.getWidth() - size) / 2;
    // top shift
    int y = ((int) img.getHeight() - size) / 2;
    return new WritableImage(img.getPixelReader(), x, y, size, size);
}
 

и нарисуйте его таким, какой он есть.

2 — Нарисуйте изображение немного за пределами круга

 ImagePattern pattern(Image img, double radius) {
    double hRad = radius;   // horizontal "radius"
    double vRad = radius;   // vertical "radius"
    if (img.getWidth() != img.getHeight()) {
        double ratio = img.getWidth() / img.getHeight();
        if (ratio > 1) {
            // Width is longer, left anchor is outside
            hRad = radius * ratio;
        } else {
            // Height is longer, top anchor is outside
            vRad = radius / ratio;
        }
    }
    return new ImagePattern(img, -hRad, -vRad, 2 * hRad, 2 * vRad, false);
}
 

Комментарии:

1. Большое вам спасибо! Я попробовал второй вариант, и он работает, ты мой герой!