/*- * #%L * Fiji distribution of ImageJ for the life sciences. * %% * Copyright (C) 2007 - 2017 Fiji developers. * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as * published by the Free Software Foundation, either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * <http://www.gnu.org/licenses/gpl-2.0.html>. * #L% */ package mpicbg.spim.io; import ij.ImagePlus; import ij.io.FileSaver; import ij.process.FloatProcessor; import ij.process.ImageProcessor; import mpicbg.imglib.cursor.LocalizablePlaneCursor; import mpicbg.imglib.cursor.array.ArrayLocalizableCursor; import mpicbg.imglib.image.Image; import mpicbg.imglib.image.display.Display; import mpicbg.imglib.type.Type; import mpicbg.imglib.type.label.FakeType; /** * * @author Stephan Preibisch * */ public class ImgLibSaver { public static <T extends Type<T>> boolean saveAsTiffs( final Image<T> img, String directory, final int type ) { return saveAsTiffs( img, directory, img.getName(), type ); } public static <T extends Type<T>> boolean saveAsTiffs( final Image<T> img, String directory, final String name, final int type ) { final Display<T> display = img.getDisplay(); boolean everythingOK = true; if ( directory == null ) directory = ""; directory = directory.replace('\\', '/'); directory = directory.trim(); if (directory.length() > 0 && !directory.endsWith("/")) directory = directory + "/"; final int numDimensions = img.getNumDimensions(); final int[] dimensionPositions = new int[ numDimensions ]; // x dimension for save is x final int dimX = 0; // y dimensins for save is y final int dimY = 1; if ( numDimensions <= 2 ) { final ImageProcessor ip = new FloatProcessor( img.getDimension( dimX ), img.getDimension( dimY ), extractSliceFloat( img, display, dimX, dimY, dimensionPositions ), null);//extract2DSlice( img, display,type, dimX, dimY, dimensionPositions ); final ImagePlus slice = new ImagePlus( name + ".tif", ip); final FileSaver fs = new FileSaver( slice ); everythingOK = everythingOK && fs.saveAsTiff(directory + slice.getTitle()); slice.close(); } else // n dimensions { final int extraDimensions[] = new int[ numDimensions - 2 ]; final int extraDimPos[] = new int[ extraDimensions.length ]; for ( int d = 2; d < numDimensions; ++d ) extraDimensions[ d - 2 ] = img.getDimension( d ); // the max number of digits for each dimension final int maxLengthDim[] = new int[ extraDimensions.length ]; for ( int d = 2; d < numDimensions; ++d ) { final String num = "" + (img.getDimension( d ) - 1); maxLengthDim[ d - 2 ] = num.length(); } // // Here we "misuse" a ArrayLocalizableCursor to iterate through the dimensions (d > 2), // he will iterate all dimensions as we want ( iterate through d=3, inc 4, iterate through 3, inc 4, ... ) // final ArrayLocalizableCursor<FakeType> cursor = ArrayLocalizableCursor.createLinearCursor( extraDimensions ); while ( cursor.hasNext() ) { cursor.fwd(); cursor.getPosition( extraDimPos ); for ( int d = 2; d < numDimensions; ++d ) dimensionPositions[ d ] = extraDimPos[ d - 2 ]; final ImageProcessor ip = new FloatProcessor( img.getDimension( dimX ), img.getDimension( dimY ), extractSliceFloat( img, display, dimX, dimY, dimensionPositions ), null); String desc = ""; for ( int d = 2; d < numDimensions; ++d ) { String descDim = "" + dimensionPositions[ d ]; while( descDim.length() < maxLengthDim[ d - 2 ] ) descDim = "0" + descDim; if ( d == 2 ) desc = desc + "_z" + descDim; else desc = desc + "_" + descDim; } final ImagePlus slice = new ImagePlus( name + desc + ".tif", ip); final FileSaver fs = new FileSaver( slice ); everythingOK = everythingOK && fs.saveAsTiff(directory + slice.getTitle()); slice.close(); } } return everythingOK; } private final static <T extends Type<T>> float[] extractSliceFloat( final Image<T> img, final Display<T> display, final int dimX, final int dimY, final int[] dimensionPositions ) { final int sizeX = img.getDimension( dimX ); final int sizeY = img.getDimension( dimY ); final LocalizablePlaneCursor<T> cursor = img.createLocalizablePlaneCursor(); cursor.reset( dimX, dimY, dimensionPositions ); // store the slice image float[] sliceImg = new float[ sizeX * sizeY ]; if ( dimY < img.getNumDimensions() ) { while ( cursor.hasNext() ) { cursor.fwd(); sliceImg[ cursor.getPosition( dimX ) + cursor.getPosition( dimY ) * sizeX ] = display.get32Bit( cursor.getType() ); } } else // only a 1D image { while ( cursor.hasNext() ) { cursor.fwd(); sliceImg[ cursor.getPosition( dimX ) ] = display.get32Bit( cursor.getType() ); } } cursor.close(); return sliceImg; } }