Я пишу приложение для рисования, у него есть ластик, который стирает линию, нарисованную пользователем, без влияния на фон изображения. Во-первых, я создаю холст для его рисования.
@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);
}
Все выглядит нормально, но когда я стираю обводку, после перетаскивания мышью у меня появляется белая рамка.
Какая причина у меня появилась и как это исправить? Спасибо!