Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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: 2 additions & 3 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,9 @@ 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)
if (overlay == null)
return;
affine.setToIdentity();
overlay.resetAffine();
});
Button btnInvert = new Button("Invert");
btnInvert.setOnAction(e -> {
Expand Down
36 changes: 34 additions & 2 deletions src/main/java/qupath/ext/align/gui/ImageServerOverlay.java
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
import java.awt.geom.AffineTransform;
import java.awt.geom.NoninvertibleTransformException;
import java.awt.image.BufferedImage;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

Expand All @@ -39,6 +40,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 +62,9 @@ public class ImageServerOverlay extends AbstractOverlay {

private AffineTransform transform;
private AffineTransform transformInverse;

private PixelCalibration viewerImageCalibration;
private PixelCalibration overlayImageCalibration;

/**
* Constructor.
Expand All @@ -84,6 +89,13 @@ public ImageServerOverlay(final QuPathViewer viewer, final ImageServer<BufferedI
this.transformInverse = null;//transform.createInverse();
// Request repaint any time the transform changes
this.affine = affine;
// Access the PixelCalibration from the current viewer and overlay server and
// reset the affine transform to a scaled identity
this.viewerImageCalibration = viewer.getImageData().getServer().getPixelCalibration();
this.overlayImageCalibration = 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 +127,27 @@ public void setRenderer(ImageRenderer renderer) {
public Affine getAffine() {
return affine;
}


/**
* Reset the affine transform to its pixel-correct scaled identity
*/
public void resetAffine() {
// The scaling factors's defaults
double mxx = 1;
double myy = 1;

if (this.affine == null)
return;

// Calculate the affine 'a' and 'y' scaling factor parameters - Defaults to 1 and 1 if no pixel size micron available.
if (this.viewerImageCalibration.hasPixelSizeMicrons() && this.overlayImageCalibration.hasPixelSizeMicrons()) {
mxx = this.viewerImageCalibration.getPixelWidthMicrons() / overlayImageCalibration.getPixelWidthMicrons();
myy = this.viewerImageCalibration.getPixelHeightMicrons() / overlayImageCalibration.getPixelHeightMicrons();
}

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

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

}

}
}