/* * Copyright (c) 2012-2016 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.utils; import java.io.File; import org.eclipse.dawnsci.analysis.api.downsample.DownsampleMode; import org.eclipse.dawnsci.analysis.api.io.IDataHolder; import org.eclipse.dawnsci.analysis.api.io.ScanFileHolderException; import org.eclipse.dawnsci.analysis.dataset.function.Downsample; import org.eclipse.january.IMonitor; import org.eclipse.january.dataset.Dataset; import org.eclipse.january.dataset.DatasetFactory; import org.eclipse.january.dataset.IDataset; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import uk.ac.diamond.scisoft.analysis.io.AbstractFileLoader; import uk.ac.diamond.scisoft.analysis.io.LoaderFactory; import uk.ac.diamond.scisoft.analysis.io.RawBinaryLoader; import uk.ac.diamond.scisoft.analysis.plotserver.DatasetWithAxisInformation; /** * */ public class ImageThumbnailLoader { private static final Logger logger = LoggerFactory.getLogger(ImageThumbnailLoader.class); /** * see {@link LoaderFactory} getData(...) method * * This implementation which does not loop over * loaders and cause out of memory error depending on how badly the loader is * coded. * * @param filename * @param createThumbnail * @return Dataset */ public static IDataset loadImage(String filename, boolean createThumbnail, boolean loadMetadata) { return loadImage(filename, null, createThumbnail, loadMetadata, null); } /** * see {@link LoaderFactory} getData(...) method * * This implementation which does not loop over * loaders and cause out of memory error depending on how badly the loader is * coded. * * @param filename * @param additionalInfo * @param createThumbnail * @param loadMetadata * @return IDataset */ public static IDataset loadImage(String filename, Object additionalInfo, boolean createThumbnail, boolean loadMetadata) { return loadImage(filename, additionalInfo, createThumbnail, loadMetadata, null); } /** * see {@link LoaderFactory} getData(...) method * * This implementation which does not loop over * loaders and cause out of memory error depending on how badly the loader is * coded. * * @param filename * @param createThumbnail * @param loadMetadata * @param monitor * @return IDataset */ public static IDataset loadImage(String filename, boolean createThumbnail, boolean loadMetadata, IMonitor monitor) { return loadImage(filename, null, createThumbnail, loadMetadata, monitor); } /** * see {@link LoaderFactory} getData(...) method * * This implementation which does not loop over * loaders and cause out of memory error depending on how badly the loader is * coded. * * @param filename * @param additionalInfo * @param createThumbnail * @return IDataset */ public static IDataset loadImage(String filename, Object additionalInfo, boolean createThumbnail, boolean loadMetadata, IMonitor monitor) { IDataHolder scan = null; if (!filename.toLowerCase().endsWith(".raw")) { // long start = -System.nanoTime(); try { scan = LoaderFactory.getData(filename, loadMetadata, monitor); } catch (Exception e) { logger.debug("Cannot load "+filename + ". Will try to load the dataset directly instead."); try { // try loading the additional Info if (additionalInfo instanceof DatasetWithAxisInformation) { DatasetWithAxisInformation data = (DatasetWithAxisInformation)additionalInfo; return data.getData(); } } catch (Exception ex) { logger.error("Could not load data with additionalinfo: ", ex); } } // start += System.nanoTime(); // logger.info("Loading {} took {}ms", filename, start/1000000); } else { RawBinaryLoader rwBinLoader = new RawBinaryLoader(filename); try { scan = rwBinLoader.loadFile(); } catch (ScanFileHolderException e) { logger.error("Cannot load "+filename, e); } } return getSingle(filename, createThumbnail, scan); } private static final int DOWNSAMPLE_SIZE_IN_PIXELS = 96; /** * Utility method for extracting the image Dataset from a * DataHolder, optionally scaling the data to a thumbnail * * @param path * @param createThumbnail * @param scan * @return single data set */ public static IDataset getSingle(final String path, final boolean createThumbnail, final IDataHolder scan) { if (scan != null && scan.size() > 0) { IDataset ds = scan.getDataset(0); return getSingleFromDataset(path, createThumbnail, ds); } Dataset ds_null = DatasetFactory.zeros(new int[] {DOWNSAMPLE_SIZE_IN_PIXELS, DOWNSAMPLE_SIZE_IN_PIXELS}, Dataset.BOOL); ds_null.setName("Invalid Image"); return ds_null; } /** * Utility method for scaling a dataset to a thumbnail * * @param path * @param ds * @return single data set */ public static IDataset getThumbnail(String path, IDataset ds) { return getSingleFromDataset(path, true, ds); } /** * Utility method for scaling a dataset to a thumbnail * * @param path * @param ds * @return single data set */ public static IDataset getSingleFromDataset(String path, boolean createThumbnail, IDataset ds) { if (ds != null) { if (ds.getRank() == 2) { // 2D datasets only!!! int width = ds.getShape()[1]; int height = ds.getShape()[0]; String name = new File(path).getName(); String dname = ds.getName(); if (dname == null || dname.length() == 0 || dname.contains(AbstractFileLoader.IMAGE_NAME_PREFIX)) { ds.setName(name); } else { ds.setName(name + AbstractFileLoader.FILEPATH_DATASET_SEPARATOR + ds.getName()); } if (createThumbnail) { int step; step = Math.max(1, (width > height ? width : height) / DOWNSAMPLE_SIZE_IN_PIXELS); int[] stepping = new int[] { step, step }; Downsample down = new Downsample(DownsampleMode.POINT, stepping); Dataset ds_downsampled = down.value(ds).get(0); ds_downsampled.setName(new String(path)); return ds_downsampled; } return ds; } } Dataset ds_null = DatasetFactory.zeros(new int[] {DOWNSAMPLE_SIZE_IN_PIXELS, DOWNSAMPLE_SIZE_IN_PIXELS}, Dataset.BOOL); ds_null.setName("Invalid Image"); return ds_null; } }