@AfterClass public void tearDown() throws Exception { writer.close(); id.delete(); }
/** * @see loci.formats.IFormatWriter#saveBytes(int, byte[], int, int, int, int) */ @Override public void saveBytes(int no, byte[] buf, IFD ifd, int x, int y, int w, int h) throws FormatException, IOException { super.saveBytes(no, buf, ifd, x, y, w, h); int index = no; while (imageLocations[series][index] != null) { if (index < imageLocations[series].length - 1) { index++; } else { break; } } imageLocations[series][index] = currentId; }
/** * Initializes the writer. * @param output The file where to write the compressed data. * @param compression The compression to use. * @param bigTiff Pass <code>true</code> to set the <code>bigTiff</code> flag, * <code>false</code> otherwise. * @return See above. * @throws Exception Thrown if an error occurred. */ private TiffWriter initializeWriter(String output, String compression, boolean bigTiff) throws Exception { IMetadata newMetadata = service.createOMEXMLMetadata(); MetadataConverter.convertMetadata(metadata, newMetadata); TiffWriter writer = new TiffWriter(); writer.setMetadataRetrieve(newMetadata); writer.setCompression(compression); writer.setWriteSequentially(true); writer.setInterleaved(false); writer.setBigTiff(bigTiff); writer.setId(output); return writer; }
/** * Saves the given image to the specified (possibly already open) file. * The IFD hashtable allows specification of TIFF parameters such as bit * depth, compression and units. */ public void saveBytes(int no, byte[] buf, IFD ifd) throws IOException, FormatException { int w = getSizeX(); int h = getSizeY(); saveBytes(no, buf, ifd, 0, 0, w, h); }
@Test public void testExplicitlyDisableTiling() { try { writer.setMetadataRetrieve(metadata); writer.setTileSizeX(0); assertEquals(0, writer.getTileSizeX()); writer.setTileSizeY(0); assertEquals(0, writer.getTileSizeY()); } catch (FormatException e) { assert(false); } }
public static Plane writeImage(String file, int tileSize, boolean littleEndian, boolean interleaved, int rgbChannels, int seriesCount, int sizeT, String compression, int pixelType, boolean bigTiff) throws Exception { TiffWriter writer = new TiffWriter(); String pixelTypeString = FormatTools.getPixelTypeString(pixelType); writer.setMetadataRetrieve(createMetadata(pixelTypeString, rgbChannels, seriesCount, littleEndian, sizeT)); writer.setCompression(compression); writer.setInterleaved(interleaved); writer.setBigTiff(bigTiff); if (tileSize != 0) { writer.setTileSizeX(tileSize); writer.setTileSizeY(tileSize); } writer.setId(file); int bytes = FormatTools.getBytesPerPixel(pixelType); byte[] plane = getPlane(PLANE_WIDTH, PLANE_HEIGHT, bytes * rgbChannels); Plane originalPlane = new Plane(plane, littleEndian, !writer.isInterleaved(), rgbChannels, FormatTools.getPixelTypeString(pixelType)); for (int s=0; s<seriesCount; s++) { writer.setSeries(s); for (int t=0; t<sizeT; t++) { writer.saveBytes(t, plane); } } writer.close(); return originalPlane; }
int no, byte[] buf, IFD ifd, int x, int y, int w, int h) throws IOException, FormatException { MetadataRetrieve retrieve = getMetadataRetrieve(); boolean littleEndian = false; if (retrieve.getPixelsBigEndian(series) != null) { try (RandomAccessInputStream tmp = createInputStream()) { tmp.order(littleEndian); if (tmp.length() == 0) { int c = getSamplesPerPixel(); int type = FormatTools.pixelTypeFromString( retrieve.getPixelsType(series).toString()); formatCompression(ifd); byte[][] lut = AWTImageTools.get8BitLookupTable(cm); if (lut != null) { int width = getSizeX(); int height = getSizeY(); ifd.put(new Integer(IFD.IMAGE_WIDTH), new Long(width)); ifd.put(new Integer(IFD.IMAGE_LENGTH), new Long(height)); interleaved || getSamplesPerPixel() == 1 ? 1 : 2); int index = (no * getResolutionCount()) + getResolution(); int currentSeries = getSeries(); int currentResolution = getResolution(); for (int i=0; i<currentSeries; i++) {
if (checkParams) checkParams(no, buf, x, y, w, h); if (ifd == null) ifd = new IFD(); MetadataRetrieve retrieve = getMetadataRetrieve(); int type = FormatTools.pixelTypeFromString( retrieve.getPixelsType(series).toString()); int index = no; int currentTileSizeX = getTileSizeX(); int currentTileSizeY = getTileSizeY(); boolean usingTiling = currentTileSizeX > 0 && currentTileSizeY > 0; if (usingTiling) { tileParams.x = x + (xTileIndex * currentTileSizeX) - (xTileIndex > 0 ? (x % currentTileSizeX) : 0); tileParams.y = y + (yTileIndex * currentTileSizeY) - (yTileIndex > 0 ? (y % currentTileSizeY) : 0); byte [] tileBuf = getTile(buf, tileParams, new Region(x, y, w, h)); index = prepareToWriteImage(no, tileBuf, ifd, tileParams.x, tileParams.y, tileParams.width, tileParams.height); if (index == -1) { return; boolean lastPlane = no == getPlaneCount() - 1; boolean lastSeries = getSeries() == retrieve.getImageCount() - 1; boolean lastResolution = getResolution() == getResolutionCount() - 1; tiffSaver.writeImage(tileBuf, ifd, index, type, tileParams.x, tileParams.y, tileParams.width, tileParams.height, lastPlane && lastSeries && lastResolution); index = prepareToWriteImage(no, buf, ifd, x, y, w, h); if (index == -1) { return;
@Test public void testSetBigTiff() throws IOException, FormatException { //Test that no exception is thrown after setting big tiff writer.setMetadataRetrieve(metadata); ((TiffWriterMock)writer).createOutputBuffer(true); long length = 4294967296L - (buf.length * 2); ((TiffWriterMock)writer).setBufferLength(length); writer.setBigTiff(true); writer.setId("test.tiff"); writer.saveBytes(0, buf, ifd); }
@Test public void testSetBigTiffFileTooLarge() throws IOException, FormatException { // Test that no exception is thrown while below the big tiff limit (2147483648L) // Exception is thrown when size is out.length() + 2 * (width * height * c * bytesPerPixel) writer.setMetadataRetrieve(metadata); ((TiffWriterMock)writer).createOutputBuffer(true); long length = 4294967296L - (buf.length * 4); ((TiffWriterMock)writer).setBufferLength(length); writer.setId("test.tiff"); writer.saveBytes(0, buf, ifd); //Test format exception is thrown after the big tiff limit (2147483648L) boolean thrown = false; try { writer.saveBytes(1, buf, ifd); } catch(FormatException e) { if (e.getMessage().contains("File is too large; call setBigTiff(true)")) { thrown = true; } } assert(thrown); }
@Test public void testGetTileSizeX() throws IOException, FormatException { writer.setMetadataRetrieve(metadata); assertEquals(0, writer.getTileSizeX()); writer.close(); writer = new TiffWriter(); metadata.setPixelsSizeX(new PositiveInteger(100), 0); writer.setMetadataRetrieve(metadata); assertEquals(0, writer.getTileSizeX()); }
@Test public void testGetTileSizeY() throws IOException, FormatException { writer.setMetadataRetrieve(metadata); assertEquals(0, writer.getTileSizeY()); writer.close(); writer = new TiffWriter(); metadata.setPixelsSizeY(new PositiveInteger(100), 0); writer.setMetadataRetrieve(metadata); assertEquals(0, writer.getTileSizeY()); }
@Test public void testGetPlaneCount() throws IOException, FormatException { writer.setMetadataRetrieve(metadata); writer.setSeries(0); assertEquals(WriterUtilities.SIZE_T * WriterUtilities.SIZE_Z * WriterUtilities.SIZE_C, writer.getPlaneCount()); metadata.setPixelsSizeC(new PositiveInteger(4), 0); metadata.setPixelsType(PixelType.INT16, 0); writer.setMetadataRetrieve(metadata); assertEquals(WriterUtilities.SIZE_T * WriterUtilities.SIZE_Z * 4, writer.getPlaneCount()); }
@Test public void testSetTileSizeX() { writer.setMetadataRetrieve(metadata); try { for (int i = 16; i < WriterUtilities.SIZE_X; i+=16) { writer.setTileSizeX(i); assertEquals(i, writer.getTileSizeX()); } writer.setTileSizeX(WriterUtilities.SIZE_X); assertEquals(WriterUtilities.SIZE_X, writer.getTileSizeX()); for (int i = 1; i < 24; i++) { writer.setTileSizeX(i); assertEquals(16, writer.getTileSizeX()); } for (int i = 24; i < 40; i++) { writer.setTileSizeX(i); assertEquals(32, writer.getTileSizeX()); } } catch(FormatException fe) { assert(false); } }
@Test public void testSetTileSizeY() { writer.setMetadataRetrieve(metadata); try { for (int i = 16; i < WriterUtilities.SIZE_Y; i+=16) { writer.setTileSizeY(i); assertEquals(i, writer.getTileSizeY()); } writer.setTileSizeY(WriterUtilities.SIZE_Y); assertEquals(WriterUtilities.SIZE_Y, writer.getTileSizeY()); for (int i = 1; i < 24; i++) { writer.setTileSizeY(i); assertEquals(16, writer.getTileSizeY()); } for (int i = 24; i < 40; i++) { writer.setTileSizeY(i); assertEquals(32, writer.getTileSizeY()); } } catch(FormatException fe) { assert(false); } }
@Override public void setId(String id) throws FormatException, IOException { log.debug("setId(" + id + ")"); super.setId(id); }
((TiffWriter) writer).setBigTiff(bigtiff); ((TiffWriter) w).setBigTiff(bigtiff);
@Override public int getPlaneCount() { return getPlaneCount(series); }
int no, byte[] buf, IFD ifd, int x, int y, int w, int h) throws IOException, FormatException { MetadataRetrieve retrieve = getMetadataRetrieve(); boolean littleEndian = false; if (retrieve.getPixelsBigEndian(series) != null) { try (RandomAccessInputStream tmp = createInputStream()) { tmp.order(littleEndian); if (tmp.length() == 0) { int c = getSamplesPerPixel(); int type = FormatTools.pixelTypeFromString( retrieve.getPixelsType(series).toString()); formatCompression(ifd); byte[][] lut = AWTImageTools.get8BitLookupTable(cm); if (lut != null) { int width = getSizeX(); int height = getSizeY(); ifd.put(new Integer(IFD.IMAGE_WIDTH), new Long(width)); ifd.put(new Integer(IFD.IMAGE_LENGTH), new Long(height)); interleaved || getSamplesPerPixel() == 1 ? 1 : 2); int index = (no * getResolutionCount()) + getResolution(); int currentSeries = getSeries(); int currentResolution = getResolution(); for (int i=0; i<currentSeries; i++) {