#342 Initial BigTIFF support

This commit is contained in:
Harald Kuhr
2017-08-21 21:59:09 +02:00
parent 3f5f48d8cb
commit 792b531b0e
20 changed files with 499 additions and 44 deletions
@@ -0,0 +1,66 @@
/*
* Copyright (c) 2012, Harald Kuhr
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name "TwelveMonkeys" nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package com.twelvemonkeys.imageio.plugins.tiff;
import com.twelvemonkeys.imageio.metadata.tiff.TIFF;
import com.twelvemonkeys.imageio.spi.ImageReaderSpiBase;
import java.io.IOException;
import java.util.Locale;
/**
* BigTIFFImageReaderSpi.
* <p/>
* This is a separate service provider for the BigTIFF format, to support
* special cases where one does not want BigTIFF support.
*
* @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a>
* @author last modified by $Author: haraldk$
* @version $Id: BigTIFFImageReaderSpi.java,v 1.0 08.05.12 15:14 haraldk Exp$
*/
public final class BigTIFFImageReaderSpi extends ImageReaderSpiBase {
/**
* Creates a {@code BigTIFFImageReaderSpi}.
*/
public BigTIFFImageReaderSpi() {
super(new BigTIFFProviderInfo());
}
public boolean canDecodeInput(final Object pSource) throws IOException {
return TIFFImageReaderSpi.canDecodeAs(pSource, TIFF.BIGTIFF_MAGIC);
}
public TIFFImageReader createReaderInstance(final Object pExtension) {
return new TIFFImageReader(this);
}
public String getDescription(final Locale pLocale) {
return "BigTIFF image reader";
}
}
@@ -0,0 +1,29 @@
package com.twelvemonkeys.imageio.plugins.tiff;
import com.twelvemonkeys.imageio.spi.ReaderWriterProviderInfo;
/**
* BigTIFFProviderInfo.
*
* @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a>
* @author last modified by $Author: harald.kuhr$
* @version $Id: BigTIFFProviderInfo.java,v 1.0 26/04/2017 harald.kuhr Exp$
*/
final class BigTIFFProviderInfo extends ReaderWriterProviderInfo {
protected BigTIFFProviderInfo() {
super(
BigTIFFProviderInfo.class,
new String[] {"bigtiff", "BigTIFF", "BIGTIFF"},
new String[] {"tif", "tiff", "btf", "tf8", "btiff"},
new String[] {
"image/tiff", "image/x-tiff"
},
"com.twelvemonkeys.imageio.plugins.tiff.TIFFImageReader",
new String[] {"com.twelvemonkeys.imageio.plugins.tiff.BigTIFFImageReaderSpi"},
null,
null,
false, TIFFStreamMetadata.SUN_NATIVE_STREAM_METADATA_FORMAT_NAME, "com.twelvemonkeys.imageio.plugins.tiff.TIFFStreamMetadataFormat", null, null,
true, TIFFMedataFormat.SUN_NATIVE_IMAGE_METADATA_FORMAT_NAME, "com.twelvemonkeys.imageio.plugins.tiff.TIFFMedataFormat", null, null
);
}
}
@@ -157,7 +157,7 @@ public final class TIFFImageReader extends ImageReaderBase {
private CompoundDirectory IFDs;
private Directory currentIFD;
TIFFImageReader(final TIFFImageReaderSpi provider) {
TIFFImageReader(final ImageReaderSpi provider) {
super(provider);
}
@@ -71,6 +71,10 @@ public final class TIFFImageReaderSpi extends ImageReaderSpiBase {
}
public boolean canDecodeInput(final Object pSource) throws IOException {
return canDecodeAs(pSource, TIFF.TIFF_MAGIC);
}
static boolean canDecodeAs(final Object pSource, final int magic) throws IOException {
if (!(pSource instanceof ImageInputStream)) {
return false;
}
@@ -95,11 +99,7 @@ public final class TIFFImageReaderSpi extends ImageReaderSpiBase {
return false;
}
// TODO: BigTiff uses version 43 instead of TIFF's 42, and header is slightly different, see
// http://www.awaresystems.be/imaging/tiff/bigtiff.html
int magic = stream.readUnsignedShort();
return magic == TIFF.TIFF_MAGIC;
return stream.readUnsignedShort() == magic;
}
finally {
stream.setByteOrder(originalOrder);
@@ -1 +1,2 @@
com.twelvemonkeys.imageio.plugins.tiff.TIFFImageReaderSpi
com.twelvemonkeys.imageio.plugins.tiff.BigTIFFImageReaderSpi
@@ -0,0 +1,68 @@
package com.twelvemonkeys.imageio.plugins.tiff;
import com.twelvemonkeys.imageio.util.ImageReaderAbstractTest;
import javax.imageio.spi.ImageReaderSpi;
import java.awt.*;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
/**
* BigTIFFImageReaderTest.
*
* @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a>
* @author last modified by $Author: harald.kuhr$
* @version $Id: BigTIFFImageReaderTest.java,v 1.0 26/04/2017 harald.kuhr Exp$
*/
public class BigTIFFImageReaderTest extends ImageReaderAbstractTest<TIFFImageReader> {
private static final BigTIFFImageReaderSpi SPI = new BigTIFFImageReaderSpi();
@Override
protected List<TestData> getTestData() {
return Arrays.asList(
new TestData(getClassLoaderResource("/bigtiff/BigTIFF.tif"), new Dimension(64, 64)),
new TestData(getClassLoaderResource("/bigtiff/BigTIFFMotorola.tif"), new Dimension(64, 64)),
new TestData(getClassLoaderResource("/bigtiff/BigTIFFLong.tif"), new Dimension(64, 64)),
new TestData(getClassLoaderResource("/bigtiff/BigTIFFLong8.tif"), new Dimension(64, 64)),
new TestData(getClassLoaderResource("/bigtiff/BigTIFFMotorolaLongStrips.tif"), new Dimension(64, 64)),
new TestData(getClassLoaderResource("/bigtiff/BigTIFFLong8Tiles.tif"), new Dimension(64, 64)),
new TestData(getClassLoaderResource("/bigtiff/BigTIFFSubIFD4.tif"), new Dimension(64, 64)),
new TestData(getClassLoaderResource("/bigtiff/BigTIFFSubIFD8.tif"), new Dimension(64, 64))
);
}
@Override
protected ImageReaderSpi createProvider() {
return SPI;
}
@Override
protected Class<TIFFImageReader> getReaderClass() {
return TIFFImageReader.class;
}
@Override
protected TIFFImageReader createReader() {
return SPI.createReaderInstance(null);
}
@Override
protected List<String> getFormatNames() {
return Arrays.asList("bigtiff", "BigTIFF", "BIGTIFF");
}
@Override
protected List<String> getSuffixes() {
return Arrays.asList("tif", "tiff", "btf", "tf8");
}
@Override
protected List<String> getMIMETypes() {
return Collections.singletonList("image/tiff");
}
// TODO: Test that all BigTIFFs are decoded equal to the classic TIFF
// TODO: Test metadata
}
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,239 @@
<html>
<head>
</head>
<body>
<p>
These images were created by <a href="http://www.awaresystems.be/">AWare Systems</a>.
</p>
<h1>Index</h1>
<p>
<a href="#classic">Classic.tif</a><br>
<a href="#bigtiff">BigTIFF.tif</a><br>
<a href="#bigtiffmotorola">BigTIFFMotorola.tif</a><br>
<a href="#bigtifflong">BigTIFFLong.tif</a><br>
<a href="#bigtifflong8">BigTIFFLong8.tif</a><br>
<a href="#bigtiffmotorolalongstrips">BigTIFFMotorolaLongStrips.tif</a><br>
<a href="#bigtifflong8tiles">BigTIFFLong8Tiles.tif</a><br>
<a href="#bigtiffsubifd4">BigTIFFSubIFD4.tif</a><br>
<a href="#bigtiffsubifd8">BigTIFFSubIFD8.tif</a><br>
</p>
<h1 id="classic">Classic.tif</h1>
<p>
Classic.tif is a basic Classic TIFF file. All files in this package have the same actual image content,
so this TIFF file serves as a reference.
</p>
<p>
Format: Classic TIFF<br>
Byte Order: Intel<br>
Ifd Offset: 12302<br>
&nbsp;&nbsp;&nbsp;&nbsp;ImageWidth (1 Short): 64<br>
&nbsp;&nbsp;&nbsp;&nbsp;ImageLength (1 Short): 64<br>
&nbsp;&nbsp;&nbsp;&nbsp;BitsPerSample (3 Short): 8, 8, 8<br>
&nbsp;&nbsp;&nbsp;&nbsp;PhotometricInterpretation (1 Short): RGB<br>
&nbsp;&nbsp;&nbsp;&nbsp;StripOffsets (1 Short): 8<br>
&nbsp;&nbsp;&nbsp;&nbsp;SamplesPerPixel (1 Short): 3<br>
&nbsp;&nbsp;&nbsp;&nbsp;RowsPerStrip (1 Short): 64<br>
&nbsp;&nbsp;&nbsp;&nbsp;StripByteCounts (1 Short): 12288<br>
</p>
<h1 id="bigtiff">BigTIFF.tif</h1>
<p>
BigTIFF.tif ressembles Classic.tif as close as possible. Except that it's a BigTIFF, that is...
</p>
<p>
Format: BigTIFF<br>
Byte Order: Intel<br>
Ifd Offset: 12304<br>
&nbsp;&nbsp;&nbsp;&nbsp;ImageWidth (1 Short): 64<br>
&nbsp;&nbsp;&nbsp;&nbsp;ImageLength (1 Short): 64<br>
&nbsp;&nbsp;&nbsp;&nbsp;BitsPerSample (3 Short): 8, 8, 8<br>
&nbsp;&nbsp;&nbsp;&nbsp;PhotometricInterpretation (1 Short): RGB<br>
&nbsp;&nbsp;&nbsp;&nbsp;StripOffsets (1 Short): 16<br>
&nbsp;&nbsp;&nbsp;&nbsp;SamplesPerPixel (1 Short): 3<br>
&nbsp;&nbsp;&nbsp;&nbsp;RowsPerStrip (1 Short): 64<br>
&nbsp;&nbsp;&nbsp;&nbsp;StripByteCounts (1 Short): 12288<br>
</p>
<h1 id="bigtiffmotorola">BigTIFFMotorola.tif</h1>
<p>
BigTIFFMotorola.tif reverses the byte order.
</p>
<p>
Format: BigTIFF<br>
Byte Order: Motorola<br>
Ifd Offset: 12304<br>
&nbsp;&nbsp;&nbsp;&nbsp;ImageWidth (1 Short): 64<br>
&nbsp;&nbsp;&nbsp;&nbsp;ImageLength (1 Short): 64<br>
&nbsp;&nbsp;&nbsp;&nbsp;BitsPerSample (3 Short): 8, 8, 8<br>
&nbsp;&nbsp;&nbsp;&nbsp;PhotometricInterpretation (1 Short): RGB<br>
&nbsp;&nbsp;&nbsp;&nbsp;StripOffsets (1 Short): 16<br>
&nbsp;&nbsp;&nbsp;&nbsp;SamplesPerPixel (1 Short): 3<br>
&nbsp;&nbsp;&nbsp;&nbsp;RowsPerStrip (1 Short): 64<br>
&nbsp;&nbsp;&nbsp;&nbsp;StripByteCounts (1 Short): 12288<br>
</p>
<h1 id="bigtifflong">BigTIFFLong.tif</h1>
<p>
All previous TIFFs specify DataType Short for StripOffsets and StripByteCounts tags. This BigTIFF instead specifies DataType Long, for these tags.
</p>
<p>
Format: BigTIFF<br>
Byte Order: Intel<br>
Ifd Offset: 12304<br>
&nbsp;&nbsp;&nbsp;&nbsp;ImageWidth (1 Short): 64<br>
&nbsp;&nbsp;&nbsp;&nbsp;ImageLength (1 Short): 64<br>
&nbsp;&nbsp;&nbsp;&nbsp;BitsPerSample (3 Short): 8, 8, 8<br>
&nbsp;&nbsp;&nbsp;&nbsp;PhotometricInterpretation (1 Short): RGB<br>
&nbsp;&nbsp;&nbsp;&nbsp;StripOffsets (1 Long): 16<br>
&nbsp;&nbsp;&nbsp;&nbsp;SamplesPerPixel (1 Short): 3<br>
&nbsp;&nbsp;&nbsp;&nbsp;RowsPerStrip (1 Short): 64<br>
&nbsp;&nbsp;&nbsp;&nbsp;StripByteCounts (1 Long): 12288<br>
</p>
<h1 id="bigtifflong8">BigTIFFLong8.tif</h1>
<p>
This next one specifies DataType Long8, for StripOffsets and StripByteCounts tags.
</p>
<p>
Format: BigTIFF<br>
Byte Order: Intel<br>
Ifd Offset: 12304<br>
&nbsp;&nbsp;&nbsp;&nbsp;ImageWidth (1 Short): 64<br>
&nbsp;&nbsp;&nbsp;&nbsp;ImageLength (1 Short): 64<br>
&nbsp;&nbsp;&nbsp;&nbsp;BitsPerSample (3 Short): 8, 8, 8<br>
&nbsp;&nbsp;&nbsp;&nbsp;PhotometricInterpretation (1 Short): RGB<br>
&nbsp;&nbsp;&nbsp;&nbsp;StripOffsets (1 Long8): 16<br>
&nbsp;&nbsp;&nbsp;&nbsp;SamplesPerPixel (1 Short): 3<br>
&nbsp;&nbsp;&nbsp;&nbsp;RowsPerStrip (1 Short): 64<br>
&nbsp;&nbsp;&nbsp;&nbsp;StripByteCounts (1 Long8): 12288<br>
</p>
<h1 id="bigtiffmotorolalongstrips">BigTIFFMotorolaLongStrips.tif</h1>
<p>
This BigTIFF has Motorola byte order, plus, it's divided over two strips. StripOffsets and StripByteCounts tags have DataType Long, so their actual value fits inside the IFD.
</p>
<p>
Format: BigTIFF<br>
Byte Order: Motorola<br>
Ifd Offset: 12304<br>
&nbsp;&nbsp;&nbsp;&nbsp;ImageWidth (1 Short): 64<br>
&nbsp;&nbsp;&nbsp;&nbsp;ImageLength (1 Short): 64<br>
&nbsp;&nbsp;&nbsp;&nbsp;BitsPerSample (3 Short): 8, 8, 8<br>
&nbsp;&nbsp;&nbsp;&nbsp;PhotometricInterpretation (1 Short): RGB<br>
&nbsp;&nbsp;&nbsp;&nbsp;StripOffsets (2 Long): 16, 6160<br>
&nbsp;&nbsp;&nbsp;&nbsp;SamplesPerPixel (1 Short): 3<br>
&nbsp;&nbsp;&nbsp;&nbsp;RowsPerStrip (1 Short): 32<br>
&nbsp;&nbsp;&nbsp;&nbsp;StripByteCounts (2 Long): 6144, 6144<br>
</p>
<h1 id="bigtifflong8tiles">BigTIFFLong8Tiles.tif</h1>
<p>
BigTIFFLong8Tiles.tif is a tiled BigTIFF. TileOffsets and TileByteCounts tags specify DataType Long8.
</p>
<p>
Format: BigTIFF<br>
Byte Order: Intel<br>
Ifd Offset: 12368<br>
&nbsp;&nbsp;&nbsp;&nbsp;ImageWidth (1 Short): 64<br>
&nbsp;&nbsp;&nbsp;&nbsp;ImageLength (1 Short): 64<br>
&nbsp;&nbsp;&nbsp;&nbsp;BitsPerSample (3 Short): 8, 8, 8<br>
&nbsp;&nbsp;&nbsp;&nbsp;PhotometricInterpretation (1 Short): RGB<br>
&nbsp;&nbsp;&nbsp;&nbsp;SamplesPerPixel (1 Short): 3<br>
&nbsp;&nbsp;&nbsp;&nbsp;TileWidth (1 Short): 32<br>
&nbsp;&nbsp;&nbsp;&nbsp;TileLength (1 Short): 32<br>
&nbsp;&nbsp;&nbsp;&nbsp;TileOffsets (4 Long8): 16, 3088, 6160, 9232<br>
&nbsp;&nbsp;&nbsp;&nbsp;TileByteCounts (4 Long8): 3072, 3072, 3072, 3072<br>
</p>
<h1 id="bigtiffsubifd4">BigTIFFSubIFD4.tif</h1>
<p>
This BigTIFF contains two pages, the second page showing almost the same image content as the first, except that the black square is white, and text color is black.
Both pages point to a downsample SubIFD, using SubIFDs DataType TIFF_IFD.
</p>
<p>
Format: BigTIFF<br>
Byte Order: Intel<br>
Ifd Offset: 15572<br>
&nbsp;&nbsp;&nbsp;&nbsp;ImageWidth (1 Short): 64<br>
&nbsp;&nbsp;&nbsp;&nbsp;ImageLength (1 Short): 64<br>
&nbsp;&nbsp;&nbsp;&nbsp;BitsPerSample (3 Short): 8, 8, 8<br>
&nbsp;&nbsp;&nbsp;&nbsp;PhotometricInterpretation (1 Short): RGB<br>
&nbsp;&nbsp;&nbsp;&nbsp;StripOffsets (1 Short): 3284<br>
&nbsp;&nbsp;&nbsp;&nbsp;SamplesPerPixel (1 Short): 3<br>
&nbsp;&nbsp;&nbsp;&nbsp;RowsPerStrip (1 Short): 64<br>
&nbsp;&nbsp;&nbsp;&nbsp;StripByteCounts (1 Short): 12288<br>
&nbsp;&nbsp;&nbsp;&nbsp;SubIFDs (1 IFD): 3088<br>
SubIfd Offset: 3088<br>
&nbsp;&nbsp;&nbsp;&nbsp;NewSubFileType (1 Long): 1<br>
&nbsp;&nbsp;&nbsp;&nbsp;ImageWidth (1 Short): 32<br>
&nbsp;&nbsp;&nbsp;&nbsp;ImageLength (1 Short): 32<br>
&nbsp;&nbsp;&nbsp;&nbsp;BitsPerSample (3 Short): 8, 8, 8<br>
&nbsp;&nbsp;&nbsp;&nbsp;PhotometricInterpretation (1 Short): RGB<br>
&nbsp;&nbsp;&nbsp;&nbsp;StripOffsets (1 Short): 16<br>
&nbsp;&nbsp;&nbsp;&nbsp;SamplesPerPixel (1 Short): 3<br>
&nbsp;&nbsp;&nbsp;&nbsp;RowsPerStrip (1 Short): 32<br>
&nbsp;&nbsp;&nbsp;&nbsp;StripByteCounts (1 Short): 3072<br>
Ifd Offset: 31324<br>
&nbsp;&nbsp;&nbsp;&nbsp;ImageWidth (1 Short): 64<br>
&nbsp;&nbsp;&nbsp;&nbsp;ImageLength (1 Short): 64<br>
&nbsp;&nbsp;&nbsp;&nbsp;BitsPerSample (3 Short): 8, 8, 8<br>
&nbsp;&nbsp;&nbsp;&nbsp;PhotometricInterpretation (1 Short): RGB<br>
&nbsp;&nbsp;&nbsp;&nbsp;StripOffsets (1 Short): 19036<br>
&nbsp;&nbsp;&nbsp;&nbsp;SamplesPerPixel (1 Short): 3<br>
&nbsp;&nbsp;&nbsp;&nbsp;RowsPerStrip (1 Short): 64<br>
&nbsp;&nbsp;&nbsp;&nbsp;StripByteCounts (1 Short): 12288<br>
&nbsp;&nbsp;&nbsp;&nbsp;SubIFDs (1 IFD): 18840<br>
SubIfd Offset: 18840<br>
&nbsp;&nbsp;&nbsp;&nbsp;NewSubFileType (1 Long): 1<br>
&nbsp;&nbsp;&nbsp;&nbsp;ImageWidth (1 Short): 32<br>
&nbsp;&nbsp;&nbsp;&nbsp;ImageLength (1 Short): 32<br>
&nbsp;&nbsp;&nbsp;&nbsp;BitsPerSample (3 Short): 8, 8, 8<br>
&nbsp;&nbsp;&nbsp;&nbsp;PhotometricInterpretation (1 Short): RGB<br>
&nbsp;&nbsp;&nbsp;&nbsp;StripOffsets (1 Short): 15768<br>
&nbsp;&nbsp;&nbsp;&nbsp;SamplesPerPixel (1 Short): 3<br>
&nbsp;&nbsp;&nbsp;&nbsp;RowsPerStrip (1 Short): 32<br>
&nbsp;&nbsp;&nbsp;&nbsp;StripByteCounts (1 Short): 3072<br>
</p>
<h1 id="bigtiffsubifd8">BigTIFFSubIFD8.tif</h1>
<p>
BigTIFFSubIFD4.tif is very much the same as BigTIFFSubIFD4.tif, except that the new DataType TIFF_IFD8 is used for the SubIFDs tag.
</p>
<p>
Format: BigTIFF<br>
Byte Order: Intel<br>
Ifd Offset: 15572<br>
&nbsp;&nbsp;&nbsp;&nbsp;ImageWidth (1 Short): 64<br>
&nbsp;&nbsp;&nbsp;&nbsp;ImageLength (1 Short): 64<br>
&nbsp;&nbsp;&nbsp;&nbsp;BitsPerSample (3 Short): 8, 8, 8<br>
&nbsp;&nbsp;&nbsp;&nbsp;PhotometricInterpretation (1 Short): RGB<br>
&nbsp;&nbsp;&nbsp;&nbsp;StripOffsets (1 Short): 3284<br>
&nbsp;&nbsp;&nbsp;&nbsp;SamplesPerPixel (1 Short): 3<br>
&nbsp;&nbsp;&nbsp;&nbsp;RowsPerStrip (1 Short): 64<br>
&nbsp;&nbsp;&nbsp;&nbsp;StripByteCounts (1 Short): 12288<br>
&nbsp;&nbsp;&nbsp;&nbsp;SubIFDs (1 IFD8): 3088<br>
SubIfd Offset: 3088<br>
&nbsp;&nbsp;&nbsp;&nbsp;NewSubFileType (1 Long): 1<br>
&nbsp;&nbsp;&nbsp;&nbsp;ImageWidth (1 Short): 32<br>
&nbsp;&nbsp;&nbsp;&nbsp;ImageLength (1 Short): 32<br>
&nbsp;&nbsp;&nbsp;&nbsp;BitsPerSample (3 Short): 8, 8, 8<br>
&nbsp;&nbsp;&nbsp;&nbsp;PhotometricInterpretation (1 Short): RGB<br>
&nbsp;&nbsp;&nbsp;&nbsp;StripOffsets (1 Short): 16<br>
&nbsp;&nbsp;&nbsp;&nbsp;SamplesPerPixel (1 Short): 3<br>
&nbsp;&nbsp;&nbsp;&nbsp;RowsPerStrip (1 Short): 32<br>
&nbsp;&nbsp;&nbsp;&nbsp;StripByteCounts (1 Short): 3072<br>
Ifd Offset: 31324<br>
&nbsp;&nbsp;&nbsp;&nbsp;ImageWidth (1 Short): 64<br>
&nbsp;&nbsp;&nbsp;&nbsp;ImageLength (1 Short): 64<br>
&nbsp;&nbsp;&nbsp;&nbsp;BitsPerSample (3 Short): 8, 8, 8<br>
&nbsp;&nbsp;&nbsp;&nbsp;PhotometricInterpretation (1 Short): RGB<br>
&nbsp;&nbsp;&nbsp;&nbsp;StripOffsets (1 Short): 19036<br>
&nbsp;&nbsp;&nbsp;&nbsp;SamplesPerPixel (1 Short): 3<br>
&nbsp;&nbsp;&nbsp;&nbsp;RowsPerStrip (1 Short): 64<br>
&nbsp;&nbsp;&nbsp;&nbsp;StripByteCounts (1 Short): 12288<br>
&nbsp;&nbsp;&nbsp;&nbsp;SubIFDs (1 IFD8): 18840<br>
SubIfd Offset: 18840<br>
&nbsp;&nbsp;&nbsp;&nbsp;NewSubFileType (1 Long): 1<br>
&nbsp;&nbsp;&nbsp;&nbsp;ImageWidth (1 Short): 32<br>
&nbsp;&nbsp;&nbsp;&nbsp;ImageLength (1 Short): 32<br>
&nbsp;&nbsp;&nbsp;&nbsp;BitsPerSample (3 Short): 8, 8, 8<br>
&nbsp;&nbsp;&nbsp;&nbsp;PhotometricInterpretation (1 Short): RGB<br>
&nbsp;&nbsp;&nbsp;&nbsp;StripOffsets (1 Short): 15768<br>
&nbsp;&nbsp;&nbsp;&nbsp;SamplesPerPixel (1 Short): 3<br>
&nbsp;&nbsp;&nbsp;&nbsp;RowsPerStrip (1 Short): 32<br>
&nbsp;&nbsp;&nbsp;&nbsp;StripByteCounts (1 Short): 3072<br>
</p>
</body>
</html>
Binary file not shown.
Binary file not shown.
Binary file not shown.