From a93ac471977906cba32d59f49e54ab7ffc64893d Mon Sep 17 00:00:00 2001 From: felmer <felmer> Date: Wed, 18 May 2011 07:45:51 +0000 Subject: [PATCH] LMS-2248 Modify library and utilities classes to handle DeltaVision, Leica, Nikon and Zeiss image containers. Stand-alone classes for getting meta-data viewing and extracting images. SVN: 21353 --- .../bioformats/BioFormatsImageUtils.java | 11 ++- .../bioformats/BioFormatsReaderLibrary.java | 2 +- .../bioformats/BioFormatsImageExtractor.java | 93 +++++++++++++++++ .../bioformats/BioFormatsImageViewer.java | 72 ++++++++++++++ .../bioformats/BioFormatsInfo.java | 99 +++++++++++++++++++ 5 files changed, 271 insertions(+), 6 deletions(-) create mode 100644 image_readers/sourceTest/java/ch/systemsx/cisd/imagereaders/bioformats/BioFormatsImageExtractor.java create mode 100644 image_readers/sourceTest/java/ch/systemsx/cisd/imagereaders/bioformats/BioFormatsImageViewer.java create mode 100644 image_readers/sourceTest/java/ch/systemsx/cisd/imagereaders/bioformats/BioFormatsInfo.java diff --git a/image_readers/source/java/ch/systemsx/cisd/imagereaders/bioformats/BioFormatsImageUtils.java b/image_readers/source/java/ch/systemsx/cisd/imagereaders/bioformats/BioFormatsImageUtils.java index b41a42c6638..4c6a0233c4f 100644 --- a/image_readers/source/java/ch/systemsx/cisd/imagereaders/bioformats/BioFormatsImageUtils.java +++ b/image_readers/source/java/ch/systemsx/cisd/imagereaders/bioformats/BioFormatsImageUtils.java @@ -33,6 +33,7 @@ import java.util.UUID; import loci.common.IRandomAccess; import loci.common.Location; import loci.formats.FormatException; +import loci.formats.IFormatHandler; import loci.formats.IFormatReader; import loci.formats.ImageReader; import loci.formats.gui.BufferedImageReader; @@ -126,7 +127,7 @@ final class BioFormatsImageUtils static BufferedImage readImage(IFormatReader reader, IRandomAccess handle, int page) throws IOExceptionUnchecked, IllegalArgumentException { - String handleId = generateHandleId(); + String handleId = generateHandleId(reader); // Add to static map. Location.mapFile(handleId, handle); try @@ -159,7 +160,7 @@ final class BioFormatsImageUtils public static Map<String, Object> readMetadata(IFormatReader reader, IRandomAccess handle) { // Add to static map. - String handleId = generateHandleId(); + String handleId = generateHandleId(reader); Location.mapFile(handleId, handle); try @@ -200,7 +201,7 @@ final class BioFormatsImageUtils IllegalArgumentException { // Add to static map. - String handleId = generateHandleId(); + String handleId = generateHandleId(reader); Location.mapFile(handleId, handle); try { @@ -229,9 +230,9 @@ final class BioFormatsImageUtils } } - public static String generateHandleId() + public static String generateHandleId(IFormatHandler formatHandler) { - return UUID.randomUUID().toString(); + return UUID.randomUUID().toString() + "." + formatHandler.getSuffixes()[0]; } private static void nullSafeAddAll(HashMap<String, Object> accumulator, diff --git a/image_readers/source/java/ch/systemsx/cisd/imagereaders/bioformats/BioFormatsReaderLibrary.java b/image_readers/source/java/ch/systemsx/cisd/imagereaders/bioformats/BioFormatsReaderLibrary.java index 824db7ca01d..a2df99be0ef 100644 --- a/image_readers/source/java/ch/systemsx/cisd/imagereaders/bioformats/BioFormatsReaderLibrary.java +++ b/image_readers/source/java/ch/systemsx/cisd/imagereaders/bioformats/BioFormatsReaderLibrary.java @@ -35,7 +35,7 @@ public class BioFormatsReaderLibrary implements IImageReaderLibrary { private static final List<String> TIFF_FORMAT_SUBSTRINGS = Arrays.asList("tiff", - "metamorph stk", "tagged image file format"); + "metamorph stk", "tagged image file format", "deltavision", "leica", "nikon", "zeiss"); public String getName() { diff --git a/image_readers/sourceTest/java/ch/systemsx/cisd/imagereaders/bioformats/BioFormatsImageExtractor.java b/image_readers/sourceTest/java/ch/systemsx/cisd/imagereaders/bioformats/BioFormatsImageExtractor.java new file mode 100644 index 00000000000..09c581c682b --- /dev/null +++ b/image_readers/sourceTest/java/ch/systemsx/cisd/imagereaders/bioformats/BioFormatsImageExtractor.java @@ -0,0 +1,93 @@ +/* + * Copyright 2011 ETH Zuerich, CISD + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package ch.systemsx.cisd.imagereaders.bioformats; + +import java.awt.FileDialog; +import java.awt.Frame; +import java.awt.image.BufferedImage; +import java.io.File; + +import javax.imageio.ImageIO; + +import loci.formats.IFormatReader; +import loci.formats.gui.BufferedImageReader; + +/** + * Stand-alone application which extracts all images from any image format understood by BioFormats. + * The images are stored in a folder as PNG images. Each argument is an image file. In case of no + * arguments a file dialog pops up. + * + * @author Franz-Josef Elmer + */ +public class BioFormatsImageExtractor +{ + public static void main(String[] args) throws Exception + { + String[] fileNames = args; + if (args.length == 0) + { + FileDialog fileDialog = new FileDialog((Frame) null); + fileDialog.setMode(FileDialog.LOAD); + fileDialog.setVisible(true); + String dir = fileDialog.getDirectory(); + fileNames = new String[] {dir + "/" + fileDialog.getFile()}; + } + for (String fileName : fileNames) + { + IFormatReader reader = BioFormatsImageUtils.tryFindReaderForFile(fileName); + if (reader == null) + { + System.out.println("No reader found: " + fileName); + continue; + } + reader.setId(fileName); + int seriesCount = reader.getSeriesCount(); + System.out.println("=========== file " + fileName + " has " + seriesCount + " series."); + File imageFolder = new File(fileName + ".extracted-images"); + imageFolder.mkdirs(); + for (int s = 0; s < seriesCount; s++) + { + reader.setSeries(s); + File serieFolder = new File(imageFolder, "s" + s); + serieFolder.mkdirs(); + int effectiveSizeC = reader.getEffectiveSizeC(); + int sizeT = reader.getSizeT(); + int sizeZ = reader.getSizeZ(); + System.out.println(" Serie " + s + " has " + sizeT + " time points, " + + sizeZ + " focal planes and " + effectiveSizeC + " color channels."); + for (int t = 0; t < sizeT; t++) + { + for (int z = 0; z < sizeZ; z++) + { + for (int c = 0; c < effectiveSizeC; c++) + { + int index = reader.getIndex(z, c, t); + BufferedImageReader biReader = + BufferedImageReader.makeBufferedImageReader(reader); + BufferedImage image = biReader.openImage(index); + String imageName = "t" + t + "-z" + z + "-c" + c; + File imageFile = new File(serieFolder, imageName + ".png"); + ImageIO.write(image, "PNG", imageFile); + System.out.println("Image extracted into " + imageFile + " (" + index + ")"); + } + } + } + } + reader.close(); + } + } +} diff --git a/image_readers/sourceTest/java/ch/systemsx/cisd/imagereaders/bioformats/BioFormatsImageViewer.java b/image_readers/sourceTest/java/ch/systemsx/cisd/imagereaders/bioformats/BioFormatsImageViewer.java new file mode 100644 index 00000000000..b006a2c5487 --- /dev/null +++ b/image_readers/sourceTest/java/ch/systemsx/cisd/imagereaders/bioformats/BioFormatsImageViewer.java @@ -0,0 +1,72 @@ +/* + * Copyright 2011 ETH Zuerich, CISD + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package ch.systemsx.cisd.imagereaders.bioformats; + +import java.awt.FileDialog; +import java.awt.Frame; +import java.awt.image.BufferedImage; +import java.awt.image.RenderedImage; +import java.io.File; + +import javax.media.jai.widget.ScrollingImagePanel; + +import ch.systemsx.cisd.imagereaders.IImageReader; +import ch.systemsx.cisd.imagereaders.TiffReadParams; + +/** + * + * + * @author Franz-Josef Elmer + */ +public class BioFormatsImageViewer +{ + public static void main(String[] args) + { + if (args.length == 0) + { + FileDialog fileDialog = new FileDialog((Frame) null); + fileDialog.setMode(FileDialog.LOAD); + fileDialog.setVisible(true); + String dir = fileDialog.getDirectory(); + args = new String[] {dir + "/" + fileDialog.getFile()}; + } + for (String fileName : args) + { + IImageReader reader = new BioFormatsReaderLibrary().tryGetReaderForFile(fileName); + + System.out.println("=========== File: " + fileName); + System.out.println("Reader: " + reader); + File file = new File(fileName); + TiffReadParams readParams = new TiffReadParams(0); + readParams.setIntensityRescalingChannel(0); + final BufferedImage image = reader.readImage(file, readParams); + showImage(image, fileName); + + } + } + + private static void showImage(final RenderedImage image, String fileName) + { + final Frame frame = new Frame("Image: " + fileName); + final ScrollingImagePanel panel = + new ScrollingImagePanel(image, image.getWidth() + 10, image.getHeight() + 10); + frame.add(panel); + frame.setLocationByPlatform(true); + frame.pack(); + frame.setVisible(true); + } +} diff --git a/image_readers/sourceTest/java/ch/systemsx/cisd/imagereaders/bioformats/BioFormatsInfo.java b/image_readers/sourceTest/java/ch/systemsx/cisd/imagereaders/bioformats/BioFormatsInfo.java new file mode 100644 index 00000000000..8ab543f1b6a --- /dev/null +++ b/image_readers/sourceTest/java/ch/systemsx/cisd/imagereaders/bioformats/BioFormatsInfo.java @@ -0,0 +1,99 @@ +/* + * Copyright 2011 ETH Zuerich, CISD + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package ch.systemsx.cisd.imagereaders.bioformats; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + +import loci.formats.CoreMetadata; +import loci.formats.IFormatReader; + +/** + * Get some meta-data from an image. + * + * @author Franz-Josef Elmer + */ +public class BioFormatsInfo +{ + + private static final int CUTTOFF = 50; + + public static void main(String[] args) throws Exception + { + for (String fileName : args) + { + IFormatReader reader = BioFormatsImageUtils.tryFindReaderForFile(fileName); + if (reader == null) + { + System.out.println("No image reader found for " + fileName); + continue; + } + reader.setId(fileName); + System.out.println("====== " + fileName); + System.out.println(" format: " + reader.getFormat()); + System.out.println(" image count: " + reader.getImageCount()); + System.out.println(" bits per pixel: " + reader.getBitsPerPixel()); + System.out.println(" dimension order: " + reader.getDimensionOrder()); + System.out.println(" size T: " + reader.getSizeT()); + System.out.println(" size X: " + reader.getSizeX()); + System.out.println(" size Y: " + reader.getSizeY()); + System.out.println(" size Z: " + reader.getSizeZ()); + System.out.println(" size C: " + reader.getSizeC()); + System.out.println(" effective size C: " + reader.getEffectiveSizeC()); + System.out.println(" pixel type: " + reader.getPixelType()); + System.out.println(" RGB channel count: " + reader.getRGBChannelCount()); + CoreMetadata[] coreMetadata = reader.getCoreMetadata(); + System.out.println(" # of core meta-data: " + coreMetadata.length); + printMap(" global meta-data", reader.getGlobalMetadata()); + int seriesCount = reader.getSeriesCount(); + System.out.println(" series count: " + seriesCount); + for (int i = 0; i < Math.min(2, seriesCount); i++) + { + reader.setSeries(i); + printMap(" series meta-data " + i, reader.getSeriesMetadata()); + } + } + + } + + private static void printMap(String title, Map<String, Object> map) + { + System.out.println(title + ":"); + List<Entry<String, Object>> entries = new ArrayList<Entry<String, Object>>(map.entrySet()); + Collections.sort(entries, new Comparator<Entry<String, Object>>() + { + public int compare(Entry<String, Object> o1, Entry<String, Object> o2) + { + return o1.getKey().compareTo(o2.getKey()); + } + }); + for (Entry<String, Object> entry : entries) + { + String value = entry.getValue().toString(); + if (value.length() > CUTTOFF) + { + value = value.substring(0, CUTTOFF) + "..."; + } + System.out.println(" " + entry.getKey() + " = " + value); + } + } + +} -- GitLab