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