Не удается удалить границу при стирании обводки на холсте JavaFX? - PullRequest
0 голосов
/ 03 апреля 2020

Я пишу приложение для рисования, у него есть ластик, который стирает линию, нарисованную пользователем, без влияния на фон изображения. Во-первых, я создаю холст для его рисования.

@FXML
public Canvas canvas;
private GraphicsContext background = null;
private GraphicsContext paint = null;
int width;
int height;
WritableImage writableBackground;
PixelReader pixelReaderBackground;

Затем я использую два GraphicsContext на основе холста, часть, связывающая фоновое изображение, другая часть - это слой для рисования пользователем.

@Override
public void initialize(URL url, ResourceBundle resourceBundle) {
    File backgroundFile = new File(getClass().getResource("/img/leopard.jpg").getFile());
    BufferedImage img = null;
    try {
        img = ImageIO.read(backgroundFile);
    } catch (IOException e) {
        e.printStackTrace();
    }
    canvas.setWidth(img.getWidth());
    canvas.setHeight(img.getHeight());
    background = canvas.getGraphicsContext2D();
    background.drawImage(new Image("/img/leopard.jpg"), 0 , 0);
    paint = canvas.getGraphicsContext2D();
    width = (int) canvas.getWidth();
    height = (int) canvas.getHeight();
    // Get background from canvas
    writableBackground = new WritableImage(width, height);
    writableBackground = canvas.snapshot(null, writableBackground);
    pixelReaderBackground = writableBackground.getPixelReader();
}

Функция ластика Я рисую белую линию, чтобы перетаскивать ее пользователем, получая все пиксельные цвета фона изображения. Когда рисует график c белого цвета, я перерисовываю его цветом фона изображения.

@FXML
public void btnEraserActionPerformed(ActionEvent actionEvent) {
    paint.setLineWidth(20);
    paint.setStroke(Color.WHITE);
    canvas.addEventFilter(MouseEvent.MOUSE_PRESSED, drawStrokeClicked);
    canvas.addEventFilter(MouseEvent.MOUSE_DRAGGED, new EventHandler<MouseEvent>() {
        @Override
        public void handle(MouseEvent mouseEvent) {
            // draw eraser line with white color
            paint.lineTo(mouseEvent.getX(), mouseEvent.getY());
            paint.stroke();
            // get image from eraser
            WritableImage writableEraser = new WritableImage(width, height);
            writableEraser = canvas.snapshot(null, writableEraser);
            pixelReaderEraser = writableEraser.getPixelReader();
            WritableImage dest = new WritableImage(width, height);
            PixelWriter writer = dest.getPixelWriter();
            // blend paint and background
            for (int x = 0; x < width; x++) {
                for (int y = 0; y < height; y++) {
                    Color eraserColor = pixelReaderEraser.getColor(x, y);
                    Color imageColor = pixelReaderBackground.getColor(x, y);
                    if (eraserColor.equals(Color.WHITE)) {
                        writer.setColor(x, y, imageColor);
                    }
                }
            }
            // redraw image
            paint.drawImage(dest, 0, 0);
        }
    });
    canvas.addEventFilter(MouseEvent.MOUSE_RELEASED, drawStrokeReleased);
}

Все выглядит нормально, но когда я стираю обводку, после перетаскивания мышью у меня появляется белая рамка.

enter image description here

Какая причина у меня появилась и как это исправить? Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...