From 15f668f42fff45e7f3843a8827be6fbd4a1f143c Mon Sep 17 00:00:00 2001
From: jakubs <jakubs>
Date: Fri, 25 Jan 2013 09:42:05 +0000
Subject: [PATCH] SP-452 BIS-297 Add reading color depth to image readers

SVN: 28193
---
 .../cisd/imagereaders/IImageReader.java       |  9 +++
 .../bioformats/BioFormatsImageUtils.java      | 34 ++++++++++-
 .../DefaultBioformatsImageReader.java         |  7 +++
 .../imagereaders/ij/ImageJReaderLibrary.java  | 12 ++++
 .../imageio/ImageIOReaderLibrary.java         | 14 +++++
 .../imagereaders/jai/DefaultImageReader.java  | 16 ++++++
 .../BioFormatsReaderLibraryTest.java          | 25 +++++++--
 .../ij/ImageJReaderLibraryTest.java           | 22 +++++---
 .../imageio/ImageIOReaderLibraryTest.java     | 25 ++++++---
 .../jai/DefaultImageReaderTest.java           | 56 ++++++++++++-------
 10 files changed, 177 insertions(+), 43 deletions(-)

diff --git a/image_readers/source/java/ch/systemsx/cisd/imagereaders/IImageReader.java b/image_readers/source/java/ch/systemsx/cisd/imagereaders/IImageReader.java
index 4922fdf2d56..4825a972229 100644
--- a/image_readers/source/java/ch/systemsx/cisd/imagereaders/IImageReader.java
+++ b/image_readers/source/java/ch/systemsx/cisd/imagereaders/IImageReader.java
@@ -132,4 +132,13 @@ public interface IImageReader
      * @return dimensions of the image
      */
     public Dimension readDimensions(IRandomAccessFile handle, ImageID imageID);
+
+    /**
+     * Reads image color depth
+     * 
+     * @param handle the image file as {@link IRandomAccessFile}
+     * @param imageID the ID of the image to be read
+     * @return the size of the color component
+     */
+    public Integer readColorDepth(IRandomAccessFile handle, ImageID imageID);
 }
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 b440211a8eb..ce3817be9da 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
@@ -346,14 +346,44 @@ final class BioFormatsImageUtils
         }
     }
 
+    static Integer readImageColorDepth(IFormatReader reader, IRandomAccess handle, ImageID imageID)
+            throws IOExceptionUnchecked, IllegalArgumentException
+    {
+        // Add to static map.
+        String handleId = generateHandleId(reader, imageID);
+        Location.mapFile(handleId, handle);
+        try
+        {
+            // This does the actual parsing.
+            reader.setId(handleId);
+            reader.setSeries(imageID.getSeriesIndex());
+            int depth = reader.getBitsPerPixel();
+            reader.close();
+            return depth;
+        } catch (FormatException ex)
+        {
+            throw CheckedExceptionTunnel.wrapIfNecessary(ex);
+        } catch (IOException ex)
+        {
+            throw CheckedExceptionTunnel.wrapIfNecessary(ex);
+        } finally
+        {
+            // Remove from static map.
+            Location.mapFile(handleId, null);
+        }
+    }
+
     public static String generateHandleId(IFormatHandler formatHandler, ImageID imageId)
     {
         String id = UUID.randomUUID().toString() + "." + formatHandler.getSuffixes()[0];
-        if (imageId != null && imageId.getFileName() != null && (imageId.getFileName().endsWith(".c01") || imageId.getFileName().endsWith("C01"))) {
+        if (imageId != null
+                && imageId.getFileName() != null
+                && (imageId.getFileName().endsWith(".c01") || imageId.getFileName().endsWith("C01")))
+        {
             id = imageId.getFileName();
         }
         return id;
-        
+
     }
 
     private static void nullSafeAddAll(HashMap<String, Object> accumulator,
diff --git a/image_readers/source/java/ch/systemsx/cisd/imagereaders/bioformats/DefaultBioformatsImageReader.java b/image_readers/source/java/ch/systemsx/cisd/imagereaders/bioformats/DefaultBioformatsImageReader.java
index aebbbd348af..1c550871696 100644
--- a/image_readers/source/java/ch/systemsx/cisd/imagereaders/bioformats/DefaultBioformatsImageReader.java
+++ b/image_readers/source/java/ch/systemsx/cisd/imagereaders/bioformats/DefaultBioformatsImageReader.java
@@ -100,4 +100,11 @@ class DefaultBioformatsImageReader extends AbstractMetaDataAwareImageReader
         IRandomAccess input = new BioFormatsRandomAccessAdapter(handle);
         return BioFormatsImageUtils.readImageDimensions(formatReader, input, imageID);
     }
+
+    @Override
+    public Integer readColorDepth(IRandomAccessFile handle, ImageID imageID)
+    {
+        IRandomAccess input = new BioFormatsRandomAccessAdapter(handle);
+        return BioFormatsImageUtils.readImageColorDepth(formatReader, input, imageID);
+    }
 }
\ No newline at end of file
diff --git a/image_readers/source/java/ch/systemsx/cisd/imagereaders/ij/ImageJReaderLibrary.java b/image_readers/source/java/ch/systemsx/cisd/imagereaders/ij/ImageJReaderLibrary.java
index 2d9c4fe0e9b..16dc8220bb4 100644
--- a/image_readers/source/java/ch/systemsx/cisd/imagereaders/ij/ImageJReaderLibrary.java
+++ b/image_readers/source/java/ch/systemsx/cisd/imagereaders/ij/ImageJReaderLibrary.java
@@ -81,6 +81,18 @@ public class ImageJReaderLibrary implements IImageReaderLibrary
                 }
                 return new Dimension(imagePlus.getWidth(), imagePlus.getHeight());
             }
+
+            @Override
+            public Integer readColorDepth(IRandomAccessFile handle, ImageID imageID)
+            {
+                AdapterIInputStreamToInputStream is = new AdapterIInputStreamToInputStream(handle);
+                ImagePlus imagePlus = new Opener().openTiff(is, "");
+                if (imagePlus == null)
+                {
+                    throw new IllegalStateException("Cannot open the image file with ImageJ.");
+                }
+                return imagePlus.getBytesPerPixel();
+            }
         };
 
     private BufferedImage createBufferedImageOfSameType(ImagePlus imagePlus)
diff --git a/image_readers/source/java/ch/systemsx/cisd/imagereaders/imageio/ImageIOReaderLibrary.java b/image_readers/source/java/ch/systemsx/cisd/imagereaders/imageio/ImageIOReaderLibrary.java
index bb97dccbec7..7f3188aa35e 100644
--- a/image_readers/source/java/ch/systemsx/cisd/imagereaders/imageio/ImageIOReaderLibrary.java
+++ b/image_readers/source/java/ch/systemsx/cisd/imagereaders/imageio/ImageIOReaderLibrary.java
@@ -133,6 +133,20 @@ public class ImageIOReaderLibrary implements IImageReaderLibrary
                     }
                 }
 
+                @Override
+                public Integer readColorDepth(IRandomAccessFile handle, ImageID imageID)
+                {
+                    try
+                    {
+                        ImageInputStream imageInput = adaptHandle(handle);
+                        ioReader.setInput(imageInput);
+                        return ioReader.read(0).getColorModel().getPixelSize();
+                    } catch (IOException ex)
+                    {
+                        throw CheckedExceptionTunnel.wrapIfNecessary(ex);
+                    }
+                }
+
                 private ImageInputStream adaptHandle(IRandomAccessFile handle)
                 {
 
diff --git a/image_readers/source/java/ch/systemsx/cisd/imagereaders/jai/DefaultImageReader.java b/image_readers/source/java/ch/systemsx/cisd/imagereaders/jai/DefaultImageReader.java
index 9dc38e05eb8..e8cee39ffad 100644
--- a/image_readers/source/java/ch/systemsx/cisd/imagereaders/jai/DefaultImageReader.java
+++ b/image_readers/source/java/ch/systemsx/cisd/imagereaders/jai/DefaultImageReader.java
@@ -110,4 +110,20 @@ class DefaultImageReader extends AbstractImageReader
             throw CheckedExceptionTunnel.wrapIfNecessary(ex);
         }
     }
+
+    @Override
+    public Integer readColorDepth(IRandomAccessFile handle, ImageID imageID)
+    {
+        try
+        {
+            InputStream input = new AdapterIInputStreamToInputStream(handle);
+            ImageDecoder decoder = ImageCodec.createImageDecoder(getName(), input, null);
+            RenderedImage renderedImage =
+                    decoder.decodeAsRenderedImage(imageID.getTimeSeriesIndex());
+            return renderedImage.getColorModel().getPixelSize();
+        } catch (IOException ex)
+        {
+            throw CheckedExceptionTunnel.wrapIfNecessary(ex);
+        }
+    }
 }
\ No newline at end of file
diff --git a/image_readers/sourceTest/java/ch/systemsx/cisd/imagereaders/bioformats/BioFormatsReaderLibraryTest.java b/image_readers/sourceTest/java/ch/systemsx/cisd/imagereaders/bioformats/BioFormatsReaderLibraryTest.java
index 0c05d60e645..148162e4429 100644
--- a/image_readers/sourceTest/java/ch/systemsx/cisd/imagereaders/bioformats/BioFormatsReaderLibraryTest.java
+++ b/image_readers/sourceTest/java/ch/systemsx/cisd/imagereaders/bioformats/BioFormatsReaderLibraryTest.java
@@ -18,10 +18,13 @@ package ch.systemsx.cisd.imagereaders.bioformats;
 
 import java.awt.image.BufferedImage;
 import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.RandomAccessFile;
 import java.util.List;
 
 import org.testng.annotations.Test;
 
+import ch.systemsx.cisd.base.io.RandomAccessFileImpl;
 import ch.systemsx.cisd.imagereaders.IImageReader;
 import ch.systemsx.cisd.imagereaders.ImageID;
 import ch.systemsx.cisd.imagereaders.ImageReaderTestCase;
@@ -32,22 +35,36 @@ import ch.systemsx.cisd.imagereaders.ImageReaderTestCase;
 public class BioFormatsReaderLibraryTest extends ImageReaderTestCase
 {
     @Test
-    public void testTIFF()
+    public void testTIFF() throws FileNotFoundException
     {
         BioFormatsReaderLibrary library = new BioFormatsReaderLibrary();
         String libraryName = library.getName();
         File imageFile = getImageFileForLibrary(libraryName, "multi-page.tif");
         IImageReader reader = library.tryGetReaderForFile(imageFile.getPath());
-        
+
         List<ImageID> imageIDs = reader.getImageIDs(imageFile);
         assertEquals("[0-0-0-0, 0-1-0-0]", imageIDs.toString());
-        
+
         BufferedImage image0 = reader.readImage(imageFile, imageIDs.get(0), null);
         assertEquals(459, image0.getWidth());
         assertEquals(435, image0.getHeight());
-        
+
         BufferedImage image1 = reader.readImage(imageFile, imageIDs.get(1), null);
         assertEquals(459, image1.getWidth());
         assertEquals(435, image1.getHeight());
+
+        int depth =
+                reader.readColorDepth(
+                        new RandomAccessFileImpl(new RandomAccessFile(imageFile, "r")),
+                        imageIDs.get(0));
+
+        assertEquals(8, depth);
+
+        depth =
+                reader.readColorDepth(
+                        new RandomAccessFileImpl(new RandomAccessFile(imageFile, "r")),
+                        imageIDs.get(1));
+
+        assertEquals(8, depth);
     }
 }
diff --git a/image_readers/sourceTest/java/ch/systemsx/cisd/imagereaders/ij/ImageJReaderLibraryTest.java b/image_readers/sourceTest/java/ch/systemsx/cisd/imagereaders/ij/ImageJReaderLibraryTest.java
index 1f46395a0eb..b072fca79f5 100644
--- a/image_readers/sourceTest/java/ch/systemsx/cisd/imagereaders/ij/ImageJReaderLibraryTest.java
+++ b/image_readers/sourceTest/java/ch/systemsx/cisd/imagereaders/ij/ImageJReaderLibraryTest.java
@@ -18,40 +18,46 @@ package ch.systemsx.cisd.imagereaders.ij;
 
 import java.awt.image.BufferedImage;
 import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.RandomAccessFile;
 import java.util.List;
 import java.util.Map;
 
 import org.testng.annotations.Test;
 
+import ch.systemsx.cisd.base.io.RandomAccessFileImpl;
 import ch.systemsx.cisd.imagereaders.IImageReader;
 import ch.systemsx.cisd.imagereaders.ImageID;
 import ch.systemsx.cisd.imagereaders.ImageReaderTestCase;
 
 /**
- * 
- *
  * @author Franz-Josef Elmer
  */
 public class ImageJReaderLibraryTest extends ImageReaderTestCase
 {
     @Test
-    public void testMultiPageTIFF()
+    public void testMultiPageTIFF() throws FileNotFoundException
     {
         ImageJReaderLibrary library = new ImageJReaderLibrary();
         String libraryName = library.getName();
         File imageFile = getImageFileForLibrary(libraryName, "multi-page.tif");
         IImageReader reader = library.tryGetReaderForFile(imageFile.getPath());
-        
+
         List<ImageID> imageIDs = reader.getImageIDs(imageFile);
         assertEquals("[0-0-0-0]", imageIDs.toString());
-        
+
         Map<String, Object> metaData = reader.readMetaData(imageFile, imageIDs.get(0), null);
         assertEquals(0, metaData.size());
-        
+
         BufferedImage image0 = reader.readImage(imageFile, imageIDs.get(0), null);
         assertEquals(459, image0.getWidth());
         assertEquals(435, image0.getHeight());
-    }
-    
 
+        int depth =
+                reader.readColorDepth(
+                        new RandomAccessFileImpl(new RandomAccessFile(imageFile, "r")),
+                        imageIDs.get(0));
+
+        assertEquals(4, depth);
+    }
 }
diff --git a/image_readers/sourceTest/java/ch/systemsx/cisd/imagereaders/imageio/ImageIOReaderLibraryTest.java b/image_readers/sourceTest/java/ch/systemsx/cisd/imagereaders/imageio/ImageIOReaderLibraryTest.java
index f8db8dc1626..8e08fdb70e7 100644
--- a/image_readers/sourceTest/java/ch/systemsx/cisd/imagereaders/imageio/ImageIOReaderLibraryTest.java
+++ b/image_readers/sourceTest/java/ch/systemsx/cisd/imagereaders/imageio/ImageIOReaderLibraryTest.java
@@ -18,19 +18,19 @@ package ch.systemsx.cisd.imagereaders.imageio;
 
 import java.awt.image.BufferedImage;
 import java.io.File;
+import java.io.RandomAccessFile;
 import java.util.List;
 import java.util.Map;
 
 import org.testng.annotations.DataProvider;
 import org.testng.annotations.Test;
 
+import ch.systemsx.cisd.base.io.RandomAccessFileImpl;
 import ch.systemsx.cisd.imagereaders.IImageReader;
 import ch.systemsx.cisd.imagereaders.ImageID;
 import ch.systemsx.cisd.imagereaders.ImageReaderTestCase;
 
 /**
- * 
- *
  * @author Franz-Josef Elmer
  */
 public class ImageIOReaderLibraryTest extends ImageReaderTestCase
@@ -40,14 +40,14 @@ public class ImageIOReaderLibraryTest extends ImageReaderTestCase
     {
         return new Object[][]
             {
-                { "pond.bmp" },
-                { "pond.gif" },
-                { "pond.jpg" },
-                { "pond.png" } };
+                { "pond.bmp", 24 },
+                { "pond.gif", 8 },
+                { "pond.jpg", 24 },
+                { "pond.png", 24 } };
     }
 
     @Test(dataProvider = "image-files")
-    public void testSingleImageExamples(String imageFileName) throws Exception
+    public void testSingleImageExamples(String imageFileName, int expectedDepth) throws Exception
     {
         ImageIOReaderLibrary library = new ImageIOReaderLibrary();
         String libraryName = library.getName();
@@ -56,12 +56,19 @@ public class ImageIOReaderLibraryTest extends ImageReaderTestCase
 
         List<ImageID> imageIDs = reader.getImageIDs(imageFile);
         assertEquals("[0-0-0-0]", imageIDs.toString());
-        
+
         Map<String, Object> metaData = reader.readMetaData(imageFile, imageIDs.get(0), null);
         assertEquals(0, metaData.size());
-        
+
         BufferedImage image = reader.readImage(imageFile, imageIDs.get(0), null);
         assertEquals(512, image.getWidth());
         assertEquals(384, image.getHeight());
+
+        int depth =
+                reader.readColorDepth(
+                        new RandomAccessFileImpl(new RandomAccessFile(imageFile, "r")),
+                        imageIDs.get(0));
+
+        assertEquals(expectedDepth, depth);
     }
 }
diff --git a/image_readers/sourceTest/java/ch/systemsx/cisd/imagereaders/jai/DefaultImageReaderTest.java b/image_readers/sourceTest/java/ch/systemsx/cisd/imagereaders/jai/DefaultImageReaderTest.java
index 95d37057c88..8fde5b9deff 100644
--- a/image_readers/sourceTest/java/ch/systemsx/cisd/imagereaders/jai/DefaultImageReaderTest.java
+++ b/image_readers/sourceTest/java/ch/systemsx/cisd/imagereaders/jai/DefaultImageReaderTest.java
@@ -18,77 +18,93 @@ package ch.systemsx.cisd.imagereaders.jai;
 
 import java.awt.image.BufferedImage;
 import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.RandomAccessFile;
 import java.util.List;
 import java.util.Map;
 
 import org.testng.annotations.DataProvider;
 import org.testng.annotations.Test;
 
+import ch.systemsx.cisd.base.io.RandomAccessFileImpl;
 import ch.systemsx.cisd.imagereaders.IImageReader;
 import ch.systemsx.cisd.imagereaders.ImageID;
 import ch.systemsx.cisd.imagereaders.ImageReaderTestCase;
 
 /**
- *
- *
  * @author Franz-Josef Elmer
  */
 public class DefaultImageReaderTest extends ImageReaderTestCase
 {
     @Test
-    public void testMultiPageTIFF()
+    public void testMultiPageTIFF() throws FileNotFoundException
     {
         JAIReaderLibrary library = new JAIReaderLibrary();
         String libraryName = library.getName();
         File imageFile = getImageFileForLibrary(libraryName, "multi-page.tif");
         IImageReader reader = library.tryGetReaderForFile(imageFile.getPath());
-        
+
         List<ImageID> imageIDs = reader.getImageIDs(imageFile);
         assertEquals("[0-0-0-0, 0-1-0-0]", imageIDs.toString());
-        
+
         Map<String, Object> metaData = reader.readMetaData(imageFile, imageIDs.get(0), null);
         assertEquals(0, metaData.size());
-        
+
         BufferedImage image0 = reader.readImage(imageFile, imageIDs.get(0), null);
         assertEquals(459, image0.getWidth());
         assertEquals(435, image0.getHeight());
-        
+
         BufferedImage image1 = reader.readImage(imageFile, imageIDs.get(1), null);
         assertEquals(460, image1.getWidth());
         assertEquals(437, image1.getHeight());
+
+        int depth =
+                reader.readColorDepth(
+                        new RandomAccessFileImpl(new RandomAccessFile(imageFile, "r")),
+                        imageIDs.get(0));
+
+        assertEquals(24, depth);
     }
-    
+
     @DataProvider(name = "image-files")
     public Object[][] librariesToTest()
     {
         return new Object[][]
             {
-                { "pond.bmp" },
-                { "pond.gif" },
-                { "pond.jpg" },
-                { "pond.png" },
-                { "pond.pgm" },
-                { "pond.tif" },
-                { "pond.ppm" } };
+                { "pond.bmp", 24 },
+                { "pond.gif", 8 },
+                { "pond.jpg", 24 },
+                { "pond.png", 24 },
+                { "pond.pgm", 8 },
+                { "pond.tif", 24 },
+                { "pond.ppm", 24 } };
     }
 
     @Test(dataProvider = "image-files")
-    public void testSingleImageExamples(String imageFileName)
+    public void testSingleImageExamples(String imageFileName, int expectedDepth)
+            throws FileNotFoundException
     {
         JAIReaderLibrary library = new JAIReaderLibrary();
         String libraryName = library.getName();
         File imageFile = getImageFileForLibrary(libraryName, imageFileName);
         IImageReader reader = library.tryGetReaderForFile(imageFile.getPath());
-        
+
         List<ImageID> imageIDs = reader.getImageIDs(imageFile);
         assertEquals("[0-0-0-0]", imageIDs.toString());
-        
+
         Map<String, Object> metaData = reader.readMetaData(imageFile, imageIDs.get(0), null);
         assertEquals(0, metaData.size());
-        
+
         BufferedImage image = reader.readImage(imageFile, imageIDs.get(0), null);
         assertEquals(512, image.getWidth());
         assertEquals(384, image.getHeight());
+
+        int depth =
+                reader.readColorDepth(
+                        new RandomAccessFileImpl(new RandomAccessFile(imageFile, "r")),
+                        imageIDs.get(0));
+
+        assertEquals(expectedDepth, depth);
     }
-    
+
 }
-- 
GitLab