Skip to content

Commit

Permalink
Added save to PNG. Minor improvements.
Browse files Browse the repository at this point in the history
  • Loading branch information
Kait0u committed Jun 19, 2024
1 parent e6d01ab commit 10c45e2
Show file tree
Hide file tree
Showing 6 changed files with 227 additions and 120 deletions.
121 changes: 59 additions & 62 deletions .idea/workspace.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions multidraw-client/src/main/java/module-info.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
module multidraw.client {
requires transitive java.desktop;

requires javafx.graphics;
requires javafx.controls;
requires javafx.swing;
requires multidraw.shared;

exports wit.pap.multidraw.client.gui to javafx.graphics;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import javafx.scene.paint.Color;
import javafx.scene.shape.StrokeLineCap;
import javafx.scene.shape.StrokeLineJoin;
import javafx.stage.FileChooser;
import javafx.stage.Modality;
import javafx.stage.Stage;

Expand All @@ -37,28 +38,32 @@
import wit.pap.multidraw.shared.globals.Globals;
import wit.pap.multidraw.shared.LayeredImage;

import java.io.File;
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.function.UnaryOperator;
import java.util.regex.Pattern;

public class MultiDrawApplication extends Application {
Button btnAbout, btnSave, btnClear, btnConnectDisconnect;
HBox connectionForm;
TextField tfHost, tfHostPort, tfNickname, tfRoom;
Spinner<Integer> spnPenSize;
ColorPicker colorPicker;

LayeredImage layeredImage;
LayeredImageStack imageStack;
Canvas canvas;
ImageView bgImageView, mgImageView;
private Stage primaryStage;
private Button btnAbout, btnSave, btnClear, btnConnectDisconnect;
private HBox connectionForm;
private TextField tfHost, tfHostPort, tfNickname, tfRoom;
private Spinner<Integer> spnPenSize;
private ColorPicker colorPicker;

private LayeredImage layeredImage;
private LayeredImageStack imageStack;
private Canvas canvas;
private ImageView bgImageView, mgImageView;

TCPHandler tcpHandler;


@Override
public void start(Stage primaryStage) throws IOException {
this.primaryStage = primaryStage;
VBox root = new VBox();
Scene scene = new Scene(root);

Expand Down Expand Up @@ -171,6 +176,7 @@ public void start(Stage primaryStage) throws IOException {

root.getChildren().add(toolBarBottom);

btnSave.setOnAction(event -> savePNG());
btnAbout.setOnAction(event -> showAboutWindow(primaryStage));
btnClear.setOnAction(event -> clearCanvas());
btnConnectDisconnect.setOnAction(event -> connect());
Expand All @@ -187,7 +193,13 @@ public void start(Stage primaryStage) throws IOException {

@Override
public void stop() {
stopHandler();
if (!tcpHandler.getIsConnectionDead()) {
stopHandler();
} else {
try {
tcpHandler.interrupt();
} catch (Exception ignored) { }
}
}

private void clearCanvas() {
Expand Down Expand Up @@ -231,10 +243,8 @@ private void connect() {
clearCanvas();


} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
Alerts.showErrorAlert(e.toString(), e.getMessage());
}
}

Expand Down Expand Up @@ -293,6 +303,20 @@ public void snapshotCanvas() {
}, snapshotParameters, img);
}

public void savePNG() {
FileChooser fileChooser = new FileChooser();
fileChooser.setTitle("Save As PNG");
FileChooser.ExtensionFilter extFilter = new FileChooser.ExtensionFilter("PNG files (*.png)", "*.png");
fileChooser.getExtensionFilters().add(extFilter);

File outFile = fileChooser.showSaveDialog(primaryStage);
if (outFile != null) {
synchronized (imageStack) {
imageStack.saveAsPNG(outFile);
}
}
}

private void showAboutWindow(Stage owner) {
Stage aboutStage = new Stage();

Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,26 @@
package wit.pap.multidraw.client.gui.widgets;

import javafx.embed.swing.SwingFXUtils;
import javafx.scene.SnapshotParameters;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.image.WritableImage;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.scene.paint.Paint;
import wit.pap.multidraw.client.gui.utilities.Alerts;
import wit.pap.multidraw.shared.globals.Globals;
import wit.pap.multidraw.shared.BgraImage;
import wit.pap.multidraw.shared.LayeredImage;

import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class LayeredImageStack extends StackPane {
private LayeredImage layeredImage;
private ImageView bgImageView, mgImageView;
Expand Down Expand Up @@ -66,6 +78,34 @@ private void draw(boolean clear) {
}
}

public void saveAsPNG(File outFile) {
if (fgCanvas == null || layeredImage == null)
return;

WritableImage writableImage = new WritableImage(Globals.IMAGE_WIDTH, Globals.IMAGE_HEIGHT);
SnapshotParameters params = new SnapshotParameters();
params.setFill(Color.TRANSPARENT);

fgCanvas.snapshot(params, writableImage);

BgraImage bg = getLayeredImage().getBackground(),
mg = getLayeredImage().getMiddleground(),
fg = BgraImage.fromFXImage(writableImage);
BgraImage result = BgraImage.overlayAll(bg, mg, fg);

if (result != null) {
BufferedImage bi = SwingFXUtils.fromFXImage(result.toWritableImage(), null);

try {
ImageIO.write(bi, "png", outFile);
} catch (IOException e) {
Alerts.showErrorAlert(e.toString(), e.getMessage());
}
}


}

// Getter for the canvas to allow external manipulation if necessary
public Canvas getFgCanvas() {
return fgCanvas;
Expand Down
Loading

0 comments on commit 10c45e2

Please sign in to comment.