/* * Copyright (c) 2012 Diamond Light Source Ltd. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html */ package uk.ac.diamond.scisoft.analysis.io; import org.eclipse.dawnsci.analysis.api.io.IDataHolder; import org.eclipse.dawnsci.analysis.api.io.ScanFileHolderException; import org.eclipse.january.dataset.Dataset; import org.eclipse.january.dataset.DatasetFactory; import org.eclipse.january.dataset.DatasetUtils; import org.eclipse.january.dataset.IDataset; import org.eclipse.january.dataset.Maths; /** * * */ public class JavaImageScaledSaver extends JavaImageSaver { double gmin = Double.NaN; double gmax = Double.NaN; /** * @param FileName * @param FileType * @param NumBits */ public JavaImageScaledSaver(String FileName, String FileType, int NumBits, boolean asUnsigned) { super(FileName, FileType, NumBits, asUnsigned); } /** * * @param FileName * @param FileType * @param NumBits * @param min value for global minimum * @param max value for global maximum */ public JavaImageScaledSaver(String FileName, String FileType, int NumBits, boolean asUnsigned, double min, double max) { super(FileName, FileType, NumBits, asUnsigned); if (min >= max) { throw new IllegalArgumentException("Minimum value supplied was not greater than maximum value"); } gmin = min; gmax = max; } @Override public void saveFile(IDataHolder dh) throws ScanFileHolderException { DataHolder dhNew = new DataHolder(); for (int i = 0, imax = dh.size(); i < imax; i++) { IDataset idata = dh.getDataset(i); Dataset data = DatasetUtils.convertToDataset(idata); if (Double.isNaN(gmin)) { double min = data.min().doubleValue(); double max = data.max().doubleValue(); if (min == max) { data = DatasetFactory.zeros(data); // if user saves an image with same value for all pixels } else { if (unsigned && min >= -maxVal / 2) { data = Maths.multiply(data, maxVal / max); data = Maths.clip(data, 0, maxVal); } else { data = DatasetUtils.norm(data); data.imultiply(maxVal); } } } else { data = Maths.clip(data, gmin, gmax); data.isubtract(gmin); data.imultiply(maxVal / (gmax - gmin)); } dhNew.addDataset(dh.getName(i), data); } super.saveFile(dhNew); } }