Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 1 addition & 4 deletions src/main/java/qupath/ext/align/gui/ImageAlignmentPane.java
Original file line number Diff line number Diff line change
Expand Up @@ -370,10 +370,7 @@ public ImageAlignmentPane(final QuPathGUI qupath) {
Button btnReset = new Button("Reset");
btnReset.setOnAction(e -> {
var overlay = getSelectedOverlay();
var affine = overlay == null ? null : overlay.getAffine();
if (affine == null)
return;
affine.setToIdentity();
overlay.resetAffine();
});
Button btnInvert = new Button("Invert");
btnInvert.setOnAction(e -> {
Expand Down
31 changes: 28 additions & 3 deletions src/main/java/qupath/ext/align/gui/ImageServerOverlay.java
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@
import qupath.lib.gui.viewer.overlays.PathOverlay;
import qupath.lib.images.ImageData;
import qupath.lib.images.servers.ImageServer;
import qupath.lib.images.servers.PixelCalibration;
import qupath.lib.regions.ImageRegion;

/**
Expand All @@ -60,6 +61,9 @@ public class ImageServerOverlay extends AbstractOverlay {

private AffineTransform transform;
private AffineTransform transformInverse;

private PixelCalibration viewerCalibration;
private PixelCalibration serverCalibration;

/**
* Constructor.
Expand All @@ -82,8 +86,15 @@ public ImageServerOverlay(final QuPathViewer viewer, final ImageServer<BufferedI
this.server = server;
this.transform = new AffineTransform();
this.transformInverse = null;//transform.createInverse();
// Request repaint any time the transform changes

this.affine = affine;
// Access the PixelCalibration from the viewer and server and
// reset the affine transform to a scaled identity
this.viewerCalibration = viewer.getImageData().getServer().getPixelCalibration();
this.serverCalibration = server.getPixelCalibration();
resetAffine();

// Request repaint any time the transform changes
this.affine.addEventHandler(TransformChangedEvent.ANY, e -> {
updateTransform();
viewer.repaintEntireImage();
Expand Down Expand Up @@ -115,7 +126,21 @@ public void setRenderer(ImageRenderer renderer) {
public Affine getAffine() {
return affine;
}


/**
* Reset the affine transform to its pixel-correct scaled identity
*/
public void resetAffine() {
if (this.affine == null)
return;

// Calculate the a and y scaling factor
double mxx = this.viewerCalibration.getPixelWidthMicrons() / serverCalibration.getPixelWidthMicrons();
double myy = this.viewerCalibration.getPixelHeightMicrons() / serverCalibration.getPixelHeightMicrons();

this.affine.setToTransform(mxx, 0, 0, 0, myy, 0);
}

private void updateTransform() {
transform.setTransform(
affine.getMxx(),
Expand Down Expand Up @@ -159,4 +184,4 @@ public void paintOverlay(Graphics2D g2d, ImageRegion imageRegion, double downsam

}

}
}