/** * Attempt to close the server. While not at all a good idea to rely on this, it may help clean up after some forgotten servers. */ @Override protected void finalize() throws Throwable { // Ensure we close... try{ close(); }catch(Throwable t){ throw t; }finally{ super.finalize(); } }
@Override public String toString() { return getServerType() + ": " + getPath() + " (" + getDisplayedImageName() + ")"; }
@Override public T getBufferedThumbnail(int maxWidth, int maxHeight, int zPosition) { double downsample = getThumbnailDownsampleFactor(maxWidth, maxHeight); return readBufferedImage( RegionRequest.createInstance(getPath(), downsample, 0, 0, getWidth(), getHeight(), zPosition, 0)); }
@Override public double getAveragedPixelSizeMicrons() { return 0.5 * (getPixelWidthMicrons() + getPixelHeightMicrons()); }
@Override public int getPreferredTileHeight() { // return 1024; return getMetadata().getPreferredTileHeight(); }
@Override public boolean usesOriginalMetadata() { return getOriginalMetadata().equals(getMetadata()); }
protected double getThumbnailDownsampleFactor(int maxWidth, int maxHeight) { if (maxWidth <= 0) { if (maxHeight <= 0) { maxWidth = 1024; maxHeight = 1024; } else { maxWidth = Integer.MAX_VALUE; } } else { if (maxHeight <= 0) { maxHeight = Integer.MAX_VALUE; } } double xDownsample = (double)getWidth() / maxWidth; double yDownsample = (double)getHeight() / maxHeight; double downsample = Math.max(xDownsample, yDownsample); if (downsample < 1) downsample = 1; return downsample; }
@Override public String getShortServerName() { return ServerTools.getDefaultShortServerName(getPath()); }
@Override public double getPreferredDownsampleFactor(double requestedDownsample) { double[] downsamples = getPreferredDownsamples(); int ind = ServerTools.getClosestDownsampleIndex(downsamples, requestedDownsample); return downsamples[ind]; }
@Override public int getPreferredTileWidth() { // return 1024; // Some servers default to 256, however in a few cases (e.g. NDPI z-stacks) this is too small; here, we aim for a compromise choosing larger tiles return getMetadata().getPreferredTileWidth(); }
@Override public boolean hasPixelSizeMicrons() { return !Double.isNaN(getPixelWidthMicrons() + getPixelHeightMicrons()); }
@Override public int getHeight() { return getMetadata().getHeight(); }
@Override public double getPixelHeightMicrons() { return getMetadata().getPixelHeightMicrons(); }
@Override public int nZSlices() { return getMetadata().getSizeZ(); }
@Override public int nTimepoints() { return getMetadata().getSizeT(); }
@Override public String getPath() { return getMetadata().getPath(); }
@Override public int nChannels() { return getMetadata().getSizeC(); // Only RGB }
@Override public double getPixelWidthMicrons() { return getMetadata().getPixelWidthMicrons(); }
@Override public double getZSpacingMicrons() { return getMetadata().getZSpacingMicrons(); }
@Override public double getMagnification() { return getMetadata().getMagnification(); }