package edu.mbl.jif.imaging.series;
import edu.mbl.jif.imaging.api.SeriesFileListener;
import edu.mbl.jif.imaging.api.SeriesOfImages;
import edu.mbl.jif.imaging.tiff.MultipageTiffFile;
import java.awt.*;
import java.awt.image.*;
/**
* <p>SeriesOfImagesMultipageTiff: </p> <p>Description: Contains a series of images </p> <p>Copyright: Copyright (c)
* 2004</p> <p>Company: </p>
*
* @author not attributable Represents a series of images Using MultipageTiffFile for viewing
*
* @version 1.0
*/
// multiple Positions mean multiple SeriesOfImages
// SeriesOfImages[]
//
public class SeriesOfImagesMultipageTiff implements SeriesOfImages, SeriesFileListener {
private String seriesFile;
private MultipageTiffFile tif;
private int numImages; // total, should = nC * nZ * nT;
private Dimension imgDim;
// Sequence, time-series
private int nT; // number of time intervals
private int nC=1; // number of Channels
private int nZ; // number of Z sections
/* TODO
* Make the image storage general...
* MultipageTiffFile
* Set of files in a directory or set of directories
* VirtualStack... Hyperstack
*
* TODO - Add Channels !!!
*/
public SeriesOfImagesMultipageTiff(String seriesFile) {
// a time series, default interval one 'unit'
this(seriesFile, 1);
}
// Time - Z-section Series
public SeriesOfImagesMultipageTiff(String seriesFile, int zSections) {
// a ZT series
this(seriesFile, 1, zSections);
}
public SeriesOfImagesMultipageTiff(String seriesFile, int channels, int zSections) {
this.seriesFile = seriesFile;
this.nZ = zSections;
this.nC = channels;
try {
tif = new MultipageTiffFile(this.seriesFile);
if (tif != null) {
imgDim = new Dimension(tif.getWidth(0), tif.getHeight(0));
numImages = tif.getNumImages();
}
if (zSections > 1) {
if (numImages % zSections != 0) {
// Warning:
}
nT = numImages / zSections / channels;
} else {
nT = numImages;
}
} catch (Exception ex) {
ex.printStackTrace();
} finally {
}
}
@Override
public int getNumImages() {
return numImages;
}
@Override
public int getZSections() {
return nZ;
}
@Override
public int getTimeIntervals() {
return nT;
}
@Override
public int getChannels() {
return nC;
}
// @Override
// public double getInterval() {
// return interval;
// }
@Override
public String getFilename() {
return seriesFile;
}
@Override
public Dimension getImageDimensions() {
return imgDim;
}
@Override
public BufferedImage getImage(int n) {
if (n < numImages) {
return tif.getImage(n);
} else {
return null;
}
}
@Override
public BufferedImage getImage(int c, int z, int t) {
int n = c + (z * nC) + (t * nZ * nC);
return getImage(n);
}
public BufferedImage getAsThumbnail(int n, int sample) {
if (n < numImages) {
return tif.getAsThumbnail(n, sample);
} else {
return null;
}
}
public void close() {
try {
if (tif != null) {
tif.close();
}
} catch (Exception e) {
}
tif = null;
}
/**
* @todo add functions
*/
@Override
public int imageAdded() {
boolean onLastSlice = true;
tif.closeRead();
tif.openRead(getFilename());
numImages = tif.getNumImages();
if (onLastSlice) {
//playCtrl.gotoSlice(numImages - 1);
}
// tif.getImage(i);
return numImages;
}
}