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