package ini.trakem2.utils;
import ij.ImagePlus;
import ij.io.FileSaver;
import ini.trakem2.io.ImageSaver;
public class Saver
{
/** Returns the supported formats. */
static public final String[] formats() {
return new String[]{".tif", ".tif.zip", ".png", ".jpg"};
}
private abstract class ASaver {
float q = 1;
abstract boolean save(ImagePlus imp, String path);
void setQuality(float q) {
this.q = q;
}
}
private class JPEGSaver extends ASaver {
JPEGSaver() {
super();
super.q = FileSaver.getJpegQuality() / 100.0f;
}
@Override
boolean save(ImagePlus imp, String path) {
return ImageSaver.saveAsJpeg(imp.getProcessor(), path, q, ImagePlus.COLOR_RGB != imp.getType());
}
}
private class PNGSaver extends ASaver {
@Override
boolean save(ImagePlus imp, String path) {
return new FileSaver(imp).saveAsPng(path);
}
}
private class TIFFSaver extends ASaver {
@Override
boolean save(ImagePlus imp, String path) {
return new FileSaver(imp).saveAsTiff(path);
}
}
private class ZIPSaver extends ASaver {
@Override
boolean save(ImagePlus imp, String path) {
return new FileSaver(imp).saveAsZip(path);
}
}
private final ASaver saver;
private final String extension;
public Saver(String extension) {
String ext = extension.toLowerCase();
if ('.' != ext.charAt(0)) ext = "." + ext;
this.extension = ext;
if (".jpeg".equals(ext) || ".jpg".equals(ext)) {
this.saver = new JPEGSaver();
} else if (".png".equals(ext)) {
this.saver = new PNGSaver();
} else if (".tiff".equals(ext) || ".tif".equals(ext)) {
this.saver = new TIFFSaver();
} else if (".tiff.zip".equals(ext) || ".tif.zip".equals(ext) || ".zip".equals(ext)) {
this.saver = new ZIPSaver();
} else {
throw new RuntimeException("Unknown format '" + extension + "'");
}
}
/**
* @param q Between 0 and 1.
*/
public void setQuality(final float q) {
this.saver.setQuality(q);
}
/**
* @param imp The {@link ImagePlus} to save.
* @param path The path to save the image at, to which the {@link #extension} will be appended if not there.
* @return
*/
public boolean save(final ImagePlus imp, String path) {
if (!path.toLowerCase().endsWith(this.extension)) {
path += this.extension;
}
return this.saver.save(imp, path);
}
public String getExtension() {
return this.extension;
}
}