как изменить размер ImageView без сглаживания

я использую метод setScale и не знаю как отключить сглаживание

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.effect.ImageInput;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.image.PixelReader;
import javafx.scene.image.WritableImage;
import javafx.scene.layout.Pane;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;

import javax.swing.*;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

public class Main extends Application {
    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        primaryStage.setTitle("size");
        Pane pane = new Pane();

        FileInputStream inputStream = new FileInputStream("coal_block.png");
        Image image = new Image(inputStream);
        ImageView imageView = new ImageView(image);
        imageView.setScaleX(100);
        imageView.setScaleY(100);
        imageView.setSmooth(false);
        pane.getChildren().add(imageView);

        Scene scene = new Scene(pane, 1024,768);
        primaryStage.setScene(scene);
        primaryStage.show();
    }
}

вот фото без сглаживания фото изображения введите сюда описание изображения

а вот что делает масштабирование сглаженное изображение


Ответы (2 шт):

Автор решения: talex

Нужно использовать Canvas. Только он умеет на самом деле отключать сглаживание.

Вот пример:

public class Main extends Application {
    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        primaryStage.setTitle("size");
        Pane pane = new Pane();

        FileInputStream inputStream = new FileInputStream("coal_block.png");
        Image image = new Image(inputStream);
        ImageCanvas imageView = new ImageCanvas(image);
        pane.getChildren().add(imageView);

        imageView.widthProperty().bind(pane.widthProperty());
        imageView.heightProperty().bind(pane.heightProperty());

        Scene scene = new Scene(pane, 1024, 768);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    static class ImageCanvas extends Canvas {
        private final Image image;

        public ImageCanvas(Image image) {
            this.image = image;
            widthProperty().addListener(observable -> render());
            heightProperty().addListener(observable -> render());
        }

        public void render() {
            GraphicsContext gc = getGraphicsContext2D();
            gc.setImageSmoothing(false);
                gc.drawImage(image,
                    0, 0, image.getWidth(), image.getHeight(),
                    0, 0, getWidth(), getHeight());
        }
    }
}
→ Ссылка
Автор решения: Armàn

По умолчанию, ImageView использует сглаживание при масштабировании изображения, но если вам нужно отключить сглаживание, установите это свойство в false.

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) {
        // Загружаем изображение
        Image image = new Image("coal_block.png");

        // Создаем ImageView и загружаем изображение
        ImageView imageView = new ImageView(image);

        // Устанавливаем размер ImageView
        imageView.setFitWidth(200);  // задаем ширину
        imageView.setFitHeight(200); // задаем высоту

        // Отключаем сглаживание при изменении размера
        imageView.setSmooth(false);

        // Создаем сцену и добавляем ImageView в нее
        StackPane root = new StackPane(imageView);
        Scene scene = new Scene(root, 400, 400);

        // Настройки окна
        primaryStage.setTitle("ImageView without smoothing");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}
→ Ссылка