Как сделать так, чтобы изображение не изменялось из-за его поворота (в JavaFX)? - PullRequest
0 голосов
/ 26 мая 2019

У меня есть метод, который вращает изображение и использует метод drawImage, чтобы отобразить его на холсте.Однако при повороте изображения оно уменьшается и увеличивается из-за изменения ширины и высоты (скажем, при повороте квадрата изменяется ширина и высота изображения).Вот метод:

public void rotateImage(GraphicsContext gc, double speed) {
    erase(gc);  // erases the previous image
    imgView.setRotate(imgView.getRotate() + speed);
    SnapshotParameters params = new SnapshotParameters();
    params.setFill(Color.TRANSPARENT);
    image = imgView.snapshot(params, null);
    gc.drawImage(image, pos.x, pos.y, width, height);
}

Любая помощь будет принята, и я могу опубликовать остальную часть кода, если это необходимо.

1 Ответ

2 голосов
/ 26 мая 2019

Снимок с предоставленными параметрами использует размеры узла в родительском элементе для определения размера изображения. Вращение изображения дает размеры, отличающиеся от размеров исходного изображения в большинстве случаев. В этих случаях снимок больше исходного изображения. (Рассмотрим квадратное изображение, повернутое на 45 °; ширина и высота повернутого изображения - это размер диагонали исходного изображения, то есть больше в sqrt(2) = 1.41... раз.)

Поскольку drawImage масштабирует нарисованное изображение до прямоугольника размером width x height, снимок, размер которого больше этого размера, уменьшается.

Вместо этого используйте преобразования GraphicsContext, чтобы не создавать новый экземпляр Image при каждом вызове метода и не масштабировать изображение.

Пример

@Override
public void start(Stage primaryStage) {
    Image image = new Image("https://upload.wikimedia.org/wikipedia/commons/thumb/8/85/Smiley.svg/240px-Smiley.svg.png");
    Canvas canvas = new Canvas(500, 500);
    GraphicsContext context = canvas.getGraphicsContext2D();
    Slider slider = new Slider(0, 360, 0);
    Button btn = new Button("draw");
    VBox root = new VBox(canvas, slider, btn);


    btn.setOnAction(evt -> {
        context.setFill(Color.TRANSPARENT);
        context.fillRect(0, 0, canvas.getWidth(), canvas.getHeight());

        double posX = 200;
        double posY = 150;

        context.save();

        // apply transformation that puts makes (posX, posY) the point
        // where (0,0) is drawn and rotate
        context.translate(posX, posY);
        context.rotate(slider.getValue());

        // draw with center at (0, 0)
        context.drawImage(image, -image.getWidth()/2, -image.getHeight()/2);

        // undo transformations
        context.restore();
    });

    primaryStage.setScene(new Scene(root));
    primaryStage.show();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...