Skip to content
Snippets Groups Projects
Commit 15f668f4 authored by jakubs's avatar jakubs
Browse files

SP-452 BIS-297 Add reading color depth to image readers

SVN: 28193
parent e3672c8e
No related branches found
No related tags found
No related merge requests found
Showing
with 177 additions and 43 deletions
...@@ -132,4 +132,13 @@ public interface IImageReader ...@@ -132,4 +132,13 @@ public interface IImageReader
* @return dimensions of the image * @return dimensions of the image
*/ */
public Dimension readDimensions(IRandomAccessFile handle, ImageID imageID); 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);
} }
...@@ -346,14 +346,44 @@ final class BioFormatsImageUtils ...@@ -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) public static String generateHandleId(IFormatHandler formatHandler, ImageID imageId)
{ {
String id = UUID.randomUUID().toString() + "." + formatHandler.getSuffixes()[0]; 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(); id = imageId.getFileName();
} }
return id; return id;
} }
private static void nullSafeAddAll(HashMap<String, Object> accumulator, private static void nullSafeAddAll(HashMap<String, Object> accumulator,
......
...@@ -100,4 +100,11 @@ class DefaultBioformatsImageReader extends AbstractMetaDataAwareImageReader ...@@ -100,4 +100,11 @@ class DefaultBioformatsImageReader extends AbstractMetaDataAwareImageReader
IRandomAccess input = new BioFormatsRandomAccessAdapter(handle); IRandomAccess input = new BioFormatsRandomAccessAdapter(handle);
return BioFormatsImageUtils.readImageDimensions(formatReader, input, imageID); 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
...@@ -81,6 +81,18 @@ public class ImageJReaderLibrary implements IImageReaderLibrary ...@@ -81,6 +81,18 @@ public class ImageJReaderLibrary implements IImageReaderLibrary
} }
return new Dimension(imagePlus.getWidth(), imagePlus.getHeight()); 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) private BufferedImage createBufferedImageOfSameType(ImagePlus imagePlus)
......
...@@ -133,6 +133,20 @@ public class ImageIOReaderLibrary implements IImageReaderLibrary ...@@ -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) private ImageInputStream adaptHandle(IRandomAccessFile handle)
{ {
......
...@@ -110,4 +110,20 @@ class DefaultImageReader extends AbstractImageReader ...@@ -110,4 +110,20 @@ class DefaultImageReader extends AbstractImageReader
throw CheckedExceptionTunnel.wrapIfNecessary(ex); 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
...@@ -18,10 +18,13 @@ package ch.systemsx.cisd.imagereaders.bioformats; ...@@ -18,10 +18,13 @@ package ch.systemsx.cisd.imagereaders.bioformats;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.io.File; import java.io.File;
import java.io.FileNotFoundException;
import java.io.RandomAccessFile;
import java.util.List; import java.util.List;
import org.testng.annotations.Test; import org.testng.annotations.Test;
import ch.systemsx.cisd.base.io.RandomAccessFileImpl;
import ch.systemsx.cisd.imagereaders.IImageReader; import ch.systemsx.cisd.imagereaders.IImageReader;
import ch.systemsx.cisd.imagereaders.ImageID; import ch.systemsx.cisd.imagereaders.ImageID;
import ch.systemsx.cisd.imagereaders.ImageReaderTestCase; import ch.systemsx.cisd.imagereaders.ImageReaderTestCase;
...@@ -32,22 +35,36 @@ import ch.systemsx.cisd.imagereaders.ImageReaderTestCase; ...@@ -32,22 +35,36 @@ import ch.systemsx.cisd.imagereaders.ImageReaderTestCase;
public class BioFormatsReaderLibraryTest extends ImageReaderTestCase public class BioFormatsReaderLibraryTest extends ImageReaderTestCase
{ {
@Test @Test
public void testTIFF() public void testTIFF() throws FileNotFoundException
{ {
BioFormatsReaderLibrary library = new BioFormatsReaderLibrary(); BioFormatsReaderLibrary library = new BioFormatsReaderLibrary();
String libraryName = library.getName(); String libraryName = library.getName();
File imageFile = getImageFileForLibrary(libraryName, "multi-page.tif"); File imageFile = getImageFileForLibrary(libraryName, "multi-page.tif");
IImageReader reader = library.tryGetReaderForFile(imageFile.getPath()); IImageReader reader = library.tryGetReaderForFile(imageFile.getPath());
List<ImageID> imageIDs = reader.getImageIDs(imageFile); List<ImageID> imageIDs = reader.getImageIDs(imageFile);
assertEquals("[0-0-0-0, 0-1-0-0]", imageIDs.toString()); assertEquals("[0-0-0-0, 0-1-0-0]", imageIDs.toString());
BufferedImage image0 = reader.readImage(imageFile, imageIDs.get(0), null); BufferedImage image0 = reader.readImage(imageFile, imageIDs.get(0), null);
assertEquals(459, image0.getWidth()); assertEquals(459, image0.getWidth());
assertEquals(435, image0.getHeight()); assertEquals(435, image0.getHeight());
BufferedImage image1 = reader.readImage(imageFile, imageIDs.get(1), null); BufferedImage image1 = reader.readImage(imageFile, imageIDs.get(1), null);
assertEquals(459, image1.getWidth()); assertEquals(459, image1.getWidth());
assertEquals(435, image1.getHeight()); 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);
} }
} }
...@@ -18,40 +18,46 @@ package ch.systemsx.cisd.imagereaders.ij; ...@@ -18,40 +18,46 @@ package ch.systemsx.cisd.imagereaders.ij;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.io.File; import java.io.File;
import java.io.FileNotFoundException;
import java.io.RandomAccessFile;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import org.testng.annotations.Test; import org.testng.annotations.Test;
import ch.systemsx.cisd.base.io.RandomAccessFileImpl;
import ch.systemsx.cisd.imagereaders.IImageReader; import ch.systemsx.cisd.imagereaders.IImageReader;
import ch.systemsx.cisd.imagereaders.ImageID; import ch.systemsx.cisd.imagereaders.ImageID;
import ch.systemsx.cisd.imagereaders.ImageReaderTestCase; import ch.systemsx.cisd.imagereaders.ImageReaderTestCase;
/** /**
*
*
* @author Franz-Josef Elmer * @author Franz-Josef Elmer
*/ */
public class ImageJReaderLibraryTest extends ImageReaderTestCase public class ImageJReaderLibraryTest extends ImageReaderTestCase
{ {
@Test @Test
public void testMultiPageTIFF() public void testMultiPageTIFF() throws FileNotFoundException
{ {
ImageJReaderLibrary library = new ImageJReaderLibrary(); ImageJReaderLibrary library = new ImageJReaderLibrary();
String libraryName = library.getName(); String libraryName = library.getName();
File imageFile = getImageFileForLibrary(libraryName, "multi-page.tif"); File imageFile = getImageFileForLibrary(libraryName, "multi-page.tif");
IImageReader reader = library.tryGetReaderForFile(imageFile.getPath()); IImageReader reader = library.tryGetReaderForFile(imageFile.getPath());
List<ImageID> imageIDs = reader.getImageIDs(imageFile); List<ImageID> imageIDs = reader.getImageIDs(imageFile);
assertEquals("[0-0-0-0]", imageIDs.toString()); assertEquals("[0-0-0-0]", imageIDs.toString());
Map<String, Object> metaData = reader.readMetaData(imageFile, imageIDs.get(0), null); Map<String, Object> metaData = reader.readMetaData(imageFile, imageIDs.get(0), null);
assertEquals(0, metaData.size()); assertEquals(0, metaData.size());
BufferedImage image0 = reader.readImage(imageFile, imageIDs.get(0), null); BufferedImage image0 = reader.readImage(imageFile, imageIDs.get(0), null);
assertEquals(459, image0.getWidth()); assertEquals(459, image0.getWidth());
assertEquals(435, image0.getHeight()); assertEquals(435, image0.getHeight());
}
int depth =
reader.readColorDepth(
new RandomAccessFileImpl(new RandomAccessFile(imageFile, "r")),
imageIDs.get(0));
assertEquals(4, depth);
}
} }
...@@ -18,19 +18,19 @@ package ch.systemsx.cisd.imagereaders.imageio; ...@@ -18,19 +18,19 @@ package ch.systemsx.cisd.imagereaders.imageio;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.io.File; import java.io.File;
import java.io.RandomAccessFile;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import org.testng.annotations.DataProvider; import org.testng.annotations.DataProvider;
import org.testng.annotations.Test; import org.testng.annotations.Test;
import ch.systemsx.cisd.base.io.RandomAccessFileImpl;
import ch.systemsx.cisd.imagereaders.IImageReader; import ch.systemsx.cisd.imagereaders.IImageReader;
import ch.systemsx.cisd.imagereaders.ImageID; import ch.systemsx.cisd.imagereaders.ImageID;
import ch.systemsx.cisd.imagereaders.ImageReaderTestCase; import ch.systemsx.cisd.imagereaders.ImageReaderTestCase;
/** /**
*
*
* @author Franz-Josef Elmer * @author Franz-Josef Elmer
*/ */
public class ImageIOReaderLibraryTest extends ImageReaderTestCase public class ImageIOReaderLibraryTest extends ImageReaderTestCase
...@@ -40,14 +40,14 @@ public class ImageIOReaderLibraryTest extends ImageReaderTestCase ...@@ -40,14 +40,14 @@ public class ImageIOReaderLibraryTest extends ImageReaderTestCase
{ {
return new Object[][] return new Object[][]
{ {
{ "pond.bmp" }, { "pond.bmp", 24 },
{ "pond.gif" }, { "pond.gif", 8 },
{ "pond.jpg" }, { "pond.jpg", 24 },
{ "pond.png" } }; { "pond.png", 24 } };
} }
@Test(dataProvider = "image-files") @Test(dataProvider = "image-files")
public void testSingleImageExamples(String imageFileName) throws Exception public void testSingleImageExamples(String imageFileName, int expectedDepth) throws Exception
{ {
ImageIOReaderLibrary library = new ImageIOReaderLibrary(); ImageIOReaderLibrary library = new ImageIOReaderLibrary();
String libraryName = library.getName(); String libraryName = library.getName();
...@@ -56,12 +56,19 @@ public class ImageIOReaderLibraryTest extends ImageReaderTestCase ...@@ -56,12 +56,19 @@ public class ImageIOReaderLibraryTest extends ImageReaderTestCase
List<ImageID> imageIDs = reader.getImageIDs(imageFile); List<ImageID> imageIDs = reader.getImageIDs(imageFile);
assertEquals("[0-0-0-0]", imageIDs.toString()); assertEquals("[0-0-0-0]", imageIDs.toString());
Map<String, Object> metaData = reader.readMetaData(imageFile, imageIDs.get(0), null); Map<String, Object> metaData = reader.readMetaData(imageFile, imageIDs.get(0), null);
assertEquals(0, metaData.size()); assertEquals(0, metaData.size());
BufferedImage image = reader.readImage(imageFile, imageIDs.get(0), null); BufferedImage image = reader.readImage(imageFile, imageIDs.get(0), null);
assertEquals(512, image.getWidth()); assertEquals(512, image.getWidth());
assertEquals(384, image.getHeight()); assertEquals(384, image.getHeight());
int depth =
reader.readColorDepth(
new RandomAccessFileImpl(new RandomAccessFile(imageFile, "r")),
imageIDs.get(0));
assertEquals(expectedDepth, depth);
} }
} }
...@@ -18,77 +18,93 @@ package ch.systemsx.cisd.imagereaders.jai; ...@@ -18,77 +18,93 @@ package ch.systemsx.cisd.imagereaders.jai;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.io.File; import java.io.File;
import java.io.FileNotFoundException;
import java.io.RandomAccessFile;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import org.testng.annotations.DataProvider; import org.testng.annotations.DataProvider;
import org.testng.annotations.Test; import org.testng.annotations.Test;
import ch.systemsx.cisd.base.io.RandomAccessFileImpl;
import ch.systemsx.cisd.imagereaders.IImageReader; import ch.systemsx.cisd.imagereaders.IImageReader;
import ch.systemsx.cisd.imagereaders.ImageID; import ch.systemsx.cisd.imagereaders.ImageID;
import ch.systemsx.cisd.imagereaders.ImageReaderTestCase; import ch.systemsx.cisd.imagereaders.ImageReaderTestCase;
/** /**
*
*
* @author Franz-Josef Elmer * @author Franz-Josef Elmer
*/ */
public class DefaultImageReaderTest extends ImageReaderTestCase public class DefaultImageReaderTest extends ImageReaderTestCase
{ {
@Test @Test
public void testMultiPageTIFF() public void testMultiPageTIFF() throws FileNotFoundException
{ {
JAIReaderLibrary library = new JAIReaderLibrary(); JAIReaderLibrary library = new JAIReaderLibrary();
String libraryName = library.getName(); String libraryName = library.getName();
File imageFile = getImageFileForLibrary(libraryName, "multi-page.tif"); File imageFile = getImageFileForLibrary(libraryName, "multi-page.tif");
IImageReader reader = library.tryGetReaderForFile(imageFile.getPath()); IImageReader reader = library.tryGetReaderForFile(imageFile.getPath());
List<ImageID> imageIDs = reader.getImageIDs(imageFile); List<ImageID> imageIDs = reader.getImageIDs(imageFile);
assertEquals("[0-0-0-0, 0-1-0-0]", imageIDs.toString()); assertEquals("[0-0-0-0, 0-1-0-0]", imageIDs.toString());
Map<String, Object> metaData = reader.readMetaData(imageFile, imageIDs.get(0), null); Map<String, Object> metaData = reader.readMetaData(imageFile, imageIDs.get(0), null);
assertEquals(0, metaData.size()); assertEquals(0, metaData.size());
BufferedImage image0 = reader.readImage(imageFile, imageIDs.get(0), null); BufferedImage image0 = reader.readImage(imageFile, imageIDs.get(0), null);
assertEquals(459, image0.getWidth()); assertEquals(459, image0.getWidth());
assertEquals(435, image0.getHeight()); assertEquals(435, image0.getHeight());
BufferedImage image1 = reader.readImage(imageFile, imageIDs.get(1), null); BufferedImage image1 = reader.readImage(imageFile, imageIDs.get(1), null);
assertEquals(460, image1.getWidth()); assertEquals(460, image1.getWidth());
assertEquals(437, image1.getHeight()); assertEquals(437, image1.getHeight());
int depth =
reader.readColorDepth(
new RandomAccessFileImpl(new RandomAccessFile(imageFile, "r")),
imageIDs.get(0));
assertEquals(24, depth);
} }
@DataProvider(name = "image-files") @DataProvider(name = "image-files")
public Object[][] librariesToTest() public Object[][] librariesToTest()
{ {
return new Object[][] return new Object[][]
{ {
{ "pond.bmp" }, { "pond.bmp", 24 },
{ "pond.gif" }, { "pond.gif", 8 },
{ "pond.jpg" }, { "pond.jpg", 24 },
{ "pond.png" }, { "pond.png", 24 },
{ "pond.pgm" }, { "pond.pgm", 8 },
{ "pond.tif" }, { "pond.tif", 24 },
{ "pond.ppm" } }; { "pond.ppm", 24 } };
} }
@Test(dataProvider = "image-files") @Test(dataProvider = "image-files")
public void testSingleImageExamples(String imageFileName) public void testSingleImageExamples(String imageFileName, int expectedDepth)
throws FileNotFoundException
{ {
JAIReaderLibrary library = new JAIReaderLibrary(); JAIReaderLibrary library = new JAIReaderLibrary();
String libraryName = library.getName(); String libraryName = library.getName();
File imageFile = getImageFileForLibrary(libraryName, imageFileName); File imageFile = getImageFileForLibrary(libraryName, imageFileName);
IImageReader reader = library.tryGetReaderForFile(imageFile.getPath()); IImageReader reader = library.tryGetReaderForFile(imageFile.getPath());
List<ImageID> imageIDs = reader.getImageIDs(imageFile); List<ImageID> imageIDs = reader.getImageIDs(imageFile);
assertEquals("[0-0-0-0]", imageIDs.toString()); assertEquals("[0-0-0-0]", imageIDs.toString());
Map<String, Object> metaData = reader.readMetaData(imageFile, imageIDs.get(0), null); Map<String, Object> metaData = reader.readMetaData(imageFile, imageIDs.get(0), null);
assertEquals(0, metaData.size()); assertEquals(0, metaData.size());
BufferedImage image = reader.readImage(imageFile, imageIDs.get(0), null); BufferedImage image = reader.readImage(imageFile, imageIDs.get(0), null);
assertEquals(512, image.getWidth()); assertEquals(512, image.getWidth());
assertEquals(384, image.getHeight()); assertEquals(384, image.getHeight());
int depth =
reader.readColorDepth(
new RandomAccessFileImpl(new RandomAccessFile(imageFile, "r")),
imageIDs.get(0));
assertEquals(expectedDepth, depth);
} }
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment