JavaFX rozmazuje powiększane obrazy.

0

Dzień dobry,

problem wygląda następująco:

Mam taki super prosty program do rysowania, tylko że na małych rozdzielczościach.
Tutaj chcę rysować na obrazie o rozdzielczości 84:48.
Żeby go jakoś godnie wyświetlić rysuję go na 10x większym Canvas canvas.
Problem polega na tym, że podczas rysowania, zostaje poddany jakiejś filtracji
i strasznie go rozmazuje, a ja chciałbym widzieć piksele.

Szukałem czegoś o tym, ale nic konkretnego nie znalazłem.
Mógłbym jeszcze użyć PixelReader, PixelWriter, ale to zbyt powolne (w przyszłości
chciałbym rysować na większych obrazach), a poza tym tak rozbudowana biblioteka, jak FX
powinna dać radę zrobić to, co chciałbym tu osiągnąć. W AWT taki program to pestka.

Bardzo proszę o pomoc.

//Program.java

import javafx.scene.input.MouseEvent;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.image.Image;
import javafx.scene.layout.FlowPane;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

public class Program {

    private Scene scene;
    private FlowPane pane;
    private Canvas canvas, c;

    public Program(Stage stage) {

        pane = new FlowPane();
        scene = new Scene(pane);
        c = new Canvas(84, 48);
        canvas = new Canvas(840, 480);

        pane.getChildren().add(canvas);

        stage.setTitle("PaintFX Test");
        stage.setScene(scene);
        c.getGraphicsContext2D().setFill(Color.BLACK);

        canvas.addEventHandler(MouseEvent.MOUSE_DRAGGED, (e) -> {
            double x = e.getX();
            double y = e.getY();

            c.getGraphicsContext2D().fillOval(x / 10, y / 10, 1, 1);

            Image i  = c.snapshot(null, null);

            GraphicsContext g = canvas.getGraphicsContext2D();
            g.drawImage(i, 0, 0, canvas.getWidth(), canvas.getHeight());

        });

        stage.show();

    }

}

//PaintFX.java

import javafx.application.Application;
import javafx.stage.Stage;

public class PaintFX extends Application{

    public static void main(String[] args) {

        launch();

    }

    public void start(Stage stage) {

        new Program(stage);

    }

}
0

Proszę Państwa, wspaniałe wieści!
Niedawno problem został naprawiony, dodano nową metodę do klasy GraphicsContext, mianowicie: void setImageSmoothing(boolean arg0).

Naprawiony kod zamieszczam poniżej.

Dziękuję i pozdrawiam wszystkich, M.S.Z.

//Program.java

import javafx.scene.input.MouseEvent;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.image.Image;
import javafx.scene.layout.FlowPane;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

public class Program {

    private Scene scene;
    private FlowPane pane;
    private Canvas canvas, c;

    public Program(Stage stage) {

        pane = new FlowPane();
        scene = new Scene(pane);
        c = new Canvas(84, 48);
        canvas = new Canvas(840, 480);

        pane.getChildren().add(canvas);

        stage.setTitle("PaintFX Test");
        stage.setScene(scene);
        c.getGraphicsContext2D().setFill(Color.BLACK);

        canvas.addEventHandler(MouseEvent.MOUSE_DRAGGED, (e) -> {
            double x = e.getX();
            double y = e.getY();

            c.getGraphicsContext2D().fillOval(x / 10, y / 10, 1, 1);

            Image i  = c.snapshot(null, null);

            GraphicsContext g = canvas.getGraphicsContext2D();
            g.setImageSmoothing(false);                                                  <== TUTAJ NASTĄPIŁA ZMIANA
            g.drawImage(i, 0, 0, canvas.getWidth(), canvas.getHeight());

        });

        stage.show();

    }

}

//PaintFX.java

import javafx.application.Application;
import javafx.stage.Stage;

public class PaintFX extends Application{

    public static void main(String[] args) {

        launch();

    }

    public void start(Stage stage) {

        new Program(stage);

    }

}

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0