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 4922fdf2d56fe9508f950b68a8a00edc4bacff74..4825a97222936268a8d7d8bcb4c147a8723e40b2 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 b440211a8eb67bf045b31d35599cdb09cdca7d7c..ce3817be9da2c5c87dc5f867b785b6eb70b6448a 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 aebbbd348afdbfad341d721d086de57466728006..1c550871696812e809c238f7ef4509a555ecd3e3 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 2d9c4fe0e9b68c805936d8288f773f4bcf3cdb45..16dc8220bb4e08f72dbb80b77cfd7ee89e307edc 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 bb97dccbec79baa557c1796f1212c7326c3ad082..7f3188aa35e1d9d2e605c17702c06b2b791c0dd0 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 9dc38e05eb8ab488d368560ca6de86e38e02b6e8..e8cee39ffad983ade2c5da4667f242a6ef8be2bf 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 0c05d60e6456bab739d2efc4597655c14a05a517..148162e44292dd81abc984dd58b45eee7131a1fe 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 1f46395a0eb7883d063e3fc0ed4faf737fa1638e..b072fca79f5a18fef23747513877c0943562ecda 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 f8db8dc1626ac607f2b97c9f470d81fadfae20d7..8e08fdb70e716bac6f91c6db6291a844560c2b84 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 95d37057c8841bea058101b92ba285f93b8f6b42..8fde5b9deffc04512bbb8be33231733106a7580a 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);
     }
-    
+
 }