public SubImageOutputStream(final ImageOutputStream stream) throws IOException { this.stream = notNull(stream, "stream"); startPos = stream.getStreamPosition(); }
private void writeICOHeader() throws IOException { if (imageOutput.getStreamPosition() != 0) { throw new IllegalStateException("Stream already written to"); } imageOutput.writeShort(0); imageOutput.writeShort(DIB.TYPE_ICO); imageOutput.flushBefore(imageOutput.getStreamPosition()); }
private void writeICNSHeader() throws IOException { if (imageOutput.getStreamPosition() != 0) { throw new IllegalStateException("Stream already written to"); } imageOutput.writeInt(ICNS.MAGIC); imageOutput.writeInt(8); // Length of file, in bytes, must be updated while writing }
/** * Creates the binary header for the raster file. * * <p>The space for the header of the rasterfile is created, filling the spaces with zeros. * After the compression the values will be rewritten * * @param rows number of rows that will be written. * @throws IOException if an error occurs while trying to write the header. */ private void createEmptyHeader(int rows) throws IOException { addressesOfRows = new long[rows + 1]; // the size of a long in C? imageOS.write(4); // write the addresses of the row begins. Since we don't know how // much // they will be compressed, they will be filled after the // compression for (int i = 0; i < rows + 1; i++) { imageOS.writeInt(0); } pointerInFilePosition = imageOS.getStreamPosition(); addressesOfRows[0] = pointerInFilePosition; }
@Override public void prepareWriteSequence(final IIOMetadata streamMetadata) throws IOException { if (writingSequence) { throw new IllegalStateException("sequence writing has already been started!"); } assertOutput(); configureStreamByteOrder(streamMetadata, imageOutput); writingSequence = true; sequenceTIFFWriter = new TIFFWriter(); sequenceTIFFWriter.writeTIFFHeader(imageOutput); sequenceLastIFDPos = imageOutput.getStreamPosition(); }
public static void writePages(ImageOutputStream imageOutput, List<TIFFPage> pages) throws IOException { TIFFWriter exif = new TIFFWriter(); long nextPagePos = imageOutput.getStreamPosition(); if (nextPagePos == 0) { exif.writeTIFFHeader(imageOutput); nextPagePos = imageOutput.getStreamPosition(); imageOutput.writeInt(0); } else { // already has pages, so remember place of EOF to replace with // IFD offset nextPagePos -= 4; } for (TIFFPage tiffPage : pages) { long ifdOffset = tiffPage.write(imageOutput, exif); long tmp = imageOutput.getStreamPosition(); imageOutput.seek(nextPagePos); imageOutput.writeInt((int) ifdOffset); imageOutput.seek(tmp); nextPagePos = tmp; imageOutput.writeInt(0); } }
private int[] writeData(long[] offsets, long[] byteCounts, ImageOutputStream outputStream) throws IOException { int[] newOffsets = new int[offsets.length]; for (int i = 0; i < offsets.length; i++) { newOffsets[i] = (int) outputStream.getStreamPosition(); stream.seek(offsets[i]); byte[] buffer = new byte[(int) byteCounts[i]]; try { stream.readFully(buffer); } catch (EOFException e) { // invalid strip length } outputStream.write(buffer); } return newOffsets; }
private void writeValueAt(final long dataOffset, final Object value, final short type, final ImageOutputStream stream) throws IOException { stream.writeInt(assertIntegerOffset(dataOffset)); long position = stream.getStreamPosition(); stream.seek(dataOffset); writeValueInline(value, type, stream); stream.seek(position); }
long imageOffset = imageOutput.getStreamPosition(); long nextPosition = imageOutput.getStreamPosition();
long resourceStart = imageOutput.getStreamPosition(); long resourceEnd = imageOutput.getStreamPosition(); if (resourceEnd > Integer.MAX_VALUE) { throw new IIOException("File too large for ICNS");
@Test public void testComputeIFDSize() throws IOException { ArrayList<Entry> entries = new ArrayList<>(); entries.add(new TIFFEntry(TIFF.TAG_ORIENTATION, TIFF.TYPE_SHORT, 1)); entries.add(new TIFFEntry(TIFF.TAG_IMAGE_WIDTH, TIFF.TYPE_SHORT, 1600)); entries.add(new AbstractEntry(TIFF.TAG_IMAGE_HEIGHT, 900) {}); entries.add(new TIFFEntry(TIFF.TAG_ARTIST, TIFF.TYPE_ASCII, "Harald K.")); entries.add(new AbstractEntry(TIFF.TAG_SOFTWARE, "TwelveMonkeys ImageIO") {}); TIFFWriter writer = createWriter(); ImageOutputStream stream = new NullImageOutputStream(); writer.write(new IFD(entries), stream); assertEquals(stream.getStreamPosition(), writer.computeIFDSize(entries) + 12); }
long dataOffset = stream.getStreamPosition(); long dataSize = computeDataSize(ordered); final long ifdOffset = stream.getStreamPosition() + dataSize + LONGWORD_LENGTH; long streamPosition = stream.getStreamPosition(); stream.seek(dataOffset); Directory subIFD = (Directory) entry.getValue();
@Test public void testComputeIFDSizeNested() throws IOException { TIFFEntry artist = new TIFFEntry(TIFF.TAG_SOFTWARE, TIFF.TYPE_ASCII, "TwelveMonkeys ImageIO"); TIFFEntry subSubSubSubIFD = new TIFFEntry(TIFF.TAG_SUB_IFD, TIFF.TYPE_LONG, new IFD(Collections.singletonList(artist))); TIFFEntry subSubSubIFD = new TIFFEntry(TIFF.TAG_SUB_IFD, TIFF.TYPE_LONG, new IFD(Collections.singletonList(subSubSubSubIFD))); TIFFEntry subSubIFD = new TIFFEntry(TIFF.TAG_SUB_IFD, TIFF.TYPE_LONG, new IFD(Collections.singletonList(subSubSubIFD))); TIFFEntry subIFD = new TIFFEntry(TIFF.TAG_SUB_IFD, TIFF.TYPE_LONG, new IFD(Collections.singletonList(subSubIFD))); List<Entry> entries = Collections.<Entry>singletonList(subIFD); TIFFWriter writer = createWriter(); ImageOutputStream stream = new NullImageOutputStream(); writer.write(new IFD(entries), stream); assertEquals(stream.getStreamPosition(), writer.computeIFDSize(entries) + 12); }
@Test public void testNesting() throws IOException { TIFFEntry artist = new TIFFEntry(TIFF.TAG_SOFTWARE, TIFF.TYPE_ASCII, "TwelveMonkeys ImageIO"); TIFFEntry subSubSubSubIFD = new TIFFEntry(TIFF.TAG_SUB_IFD, TIFF.TYPE_LONG, new IFD(Collections.singletonList(artist))); TIFFEntry subSubSubIFD = new TIFFEntry(TIFF.TAG_SUB_IFD, TIFF.TYPE_LONG, new IFD(Collections.singletonList(subSubSubSubIFD))); TIFFEntry subSubIFD = new TIFFEntry(TIFF.TAG_SUB_IFD, TIFF.TYPE_LONG, new IFD(Collections.singletonList(subSubSubIFD))); TIFFEntry subIFD = new TIFFEntry(TIFF.TAG_SUB_IFD, TIFF.TYPE_LONG, new IFD(Collections.singletonList(subSubIFD))); Directory directory = new IFD(Collections.<Entry>singletonList(subIFD)); ByteArrayOutputStream output = new FastByteArrayOutputStream(1024); ImageOutputStream imageStream = ImageIO.createImageOutputStream(output); new TIFFWriter().write(directory, imageStream); imageStream.flush(); assertEquals(output.size(), imageStream.getStreamPosition()); Directory read = new TIFFReader().read(new ByteArrayImageInputStream(output.toByteArray())); assertNotNull(read); assertEquals(1, read.size()); assertEquals(subIFD, read.getEntryById(TIFF.TAG_SUB_IFD)); // Recursively tests content! }
@Test public void testWriteIntel() throws IOException { ArrayList<Entry> entries = new ArrayList<>(); entries.add(new AbstractEntry(TIFF.TAG_SOFTWARE, "TwelveMonkeys ImageIO") {}); entries.add(new TIFFEntry(TIFF.TAG_IMAGE_WIDTH, TIFF.TYPE_LONG, Integer.MAX_VALUE)); Directory directory = new AbstractDirectory(entries) {}; ByteArrayOutputStream output = new FastByteArrayOutputStream(1024); ImageOutputStream imageStream = ImageIO.createImageOutputStream(output); imageStream.setByteOrder(ByteOrder.LITTLE_ENDIAN); // LE = Intel new TIFFWriter().write(directory, imageStream); imageStream.flush(); assertEquals(output.size(), imageStream.getStreamPosition()); byte[] data = output.toByteArray(); assertEquals(60, data.length); assertEquals('I', data[0]); assertEquals('I', data[1]); assertEquals(42, data[2]); assertEquals(0, data[3]); Directory read = new TIFFReader().read(new ByteArrayImageInputStream(data)); assertNotNull(read); assertEquals(2, read.size()); assertNotNull(read.getEntryById(TIFF.TAG_SOFTWARE)); assertEquals("TwelveMonkeys ImageIO", read.getEntryById(TIFF.TAG_SOFTWARE).getValue()); assertNotNull(read.getEntryById(TIFF.TAG_IMAGE_WIDTH)); assertEquals((long) Integer.MAX_VALUE, read.getEntryById(TIFF.TAG_IMAGE_WIDTH).getValue()); }
@Test public void testWriteIntel() throws IOException { ArrayList<Entry> entries = new ArrayList<>(); entries.add(new AbstractEntry(TIFF.TAG_SOFTWARE, "TwelveMonkeys ImageIO") {}); entries.add(new TIFFEntry(TIFF.TAG_IMAGE_WIDTH, TIFF.TYPE_LONG, Integer.MAX_VALUE)); Directory directory = new AbstractDirectory(entries) {}; ByteArrayOutputStream output = new FastByteArrayOutputStream(1024); ImageOutputStream imageStream = ImageIO.createImageOutputStream(output); imageStream.setByteOrder(ByteOrder.LITTLE_ENDIAN); // LE = Intel new TIFFWriter().write(directory, imageStream); imageStream.flush(); assertEquals(output.size(), imageStream.getStreamPosition()); byte[] data = output.toByteArray(); assertEquals(60, data.length); assertEquals('I', data[0]); assertEquals('I', data[1]); assertEquals(42, data[2]); assertEquals(0, data[3]); Directory read = new TIFFReader().read(new ByteArrayImageInputStream(data)); assertNotNull(read); assertEquals(2, read.size()); assertNotNull(read.getEntryById(TIFF.TAG_SOFTWARE)); assertEquals("TwelveMonkeys ImageIO", read.getEntryById(TIFF.TAG_SOFTWARE).getValue()); assertNotNull(read.getEntryById(TIFF.TAG_IMAGE_WIDTH)); assertEquals((long) Integer.MAX_VALUE, read.getEntryById(TIFF.TAG_IMAGE_WIDTH).getValue()); }
@Test public void testWriteMotorola() throws IOException { ArrayList<Entry> entries = new ArrayList<>(); entries.add(new AbstractEntry(TIFF.TAG_SOFTWARE, "TwelveMonkeys ImageIO") {}); entries.add(new TIFFEntry(TIFF.TAG_IMAGE_WIDTH, TIFF.TYPE_LONG, Integer.MAX_VALUE)); Directory directory = new AbstractDirectory(entries) {}; ByteArrayOutputStream output = new FastByteArrayOutputStream(1024); ImageOutputStream imageStream = ImageIO.createImageOutputStream(output); imageStream.setByteOrder(ByteOrder.BIG_ENDIAN); // BE = Motorola new TIFFWriter().write(directory, imageStream); imageStream.flush(); assertEquals(output.size(), imageStream.getStreamPosition()); byte[] data = output.toByteArray(); assertEquals(60, data.length); assertEquals('M', data[0]); assertEquals('M', data[1]); assertEquals(0, data[2]); assertEquals(42, data[3]); Directory read = new TIFFReader().read(new ByteArrayImageInputStream(data)); assertNotNull(read); assertEquals(2, read.size()); assertNotNull(read.getEntryById(TIFF.TAG_SOFTWARE)); assertEquals("TwelveMonkeys ImageIO", read.getEntryById(TIFF.TAG_SOFTWARE).getValue()); assertNotNull(read.getEntryById(TIFF.TAG_IMAGE_WIDTH)); assertEquals((long) Integer.MAX_VALUE, read.getEntryById(TIFF.TAG_IMAGE_WIDTH).getValue()); }
@Test public void testWriteMotorola() throws IOException { ArrayList<Entry> entries = new ArrayList<>(); entries.add(new AbstractEntry(TIFF.TAG_SOFTWARE, "TwelveMonkeys ImageIO") {}); entries.add(new TIFFEntry(TIFF.TAG_IMAGE_WIDTH, TIFF.TYPE_LONG, Integer.MAX_VALUE)); Directory directory = new AbstractDirectory(entries) {}; ByteArrayOutputStream output = new FastByteArrayOutputStream(1024); ImageOutputStream imageStream = ImageIO.createImageOutputStream(output); imageStream.setByteOrder(ByteOrder.BIG_ENDIAN); // BE = Motorola new TIFFWriter().write(directory, imageStream); imageStream.flush(); assertEquals(output.size(), imageStream.getStreamPosition()); byte[] data = output.toByteArray(); assertEquals(60, data.length); assertEquals('M', data[0]); assertEquals('M', data[1]); assertEquals(0, data[2]); assertEquals(42, data[3]); Directory read = new TIFFReader().read(new ByteArrayImageInputStream(data)); assertNotNull(read); assertEquals(2, read.size()); assertNotNull(read.getEntryById(TIFF.TAG_SOFTWARE)); assertEquals("TwelveMonkeys ImageIO", read.getEntryById(TIFF.TAG_SOFTWARE).getValue()); assertNotNull(read.getEntryById(TIFF.TAG_IMAGE_WIDTH)); assertEquals((long) Integer.MAX_VALUE, read.getEntryById(TIFF.TAG_IMAGE_WIDTH).getValue()); }
imageStream.flush(); assertEquals(output.size(), imageStream.getStreamPosition());
imageStream.flush(); assertEquals(output.size(), imageStream.getStreamPosition());