int posFilePointer = (int)s.getFilePointer();
posFilePointer += jpegOffset;
s.seek(posFilePointer);
s.readFully(jpeg);
img = new Jpeg(jpeg);
}
else if (compression == TIFFConstants.COMPRESSION_JPEG) {
if (size.length > 1)
throw new IOException(MessageLocalization.getComposedMessage("compression.jpeg.is.only.supported.with.a.single.strip.this.image.has.1.strips", size.length));
byte[] jpeg = new byte[(int)size[0]];
s.seek(offset[0]);
s.readFully(jpeg);
// if quantization and/or Huffman tables are stored separately in the tiff,
// we need to add them to the jpeg data
TIFFField jpegtables = dir.getField(TIFFConstants.TIFFTAG_JPEGTABLES);
if (jpegtables != null) {
byte[] temp = jpegtables.getAsBytes();
int tableoffset = 0;
int tablelength = temp.length;
// remove FFD8 from start
if (temp[0] == (byte) 0xFF && temp[1] == (byte) 0xD8) {
tableoffset = 2;
tablelength -= 2;
}
// remove FFD9 from end
if (temp[temp.length-2] == (byte) 0xFF && temp[temp.length-1] == (byte) 0xD9)
tablelength -= 2;
byte[] tables = new byte[tablelength];
System.arraycopy(temp, tableoffset, tables, 0, tablelength);
// TODO insert after JFIF header, instead of at the start
byte[] jpegwithtables = new byte[jpeg.length + tables.length];
System.arraycopy(jpeg, 0, jpegwithtables, 0, 2);
System.arraycopy(tables, 0, jpegwithtables, 2, tables.length);
System.arraycopy(jpeg, 2, jpegwithtables, tables.length+2, jpeg.length-2);
jpeg = jpegwithtables;
}
img = new Jpeg(jpeg);
if (photometric == TIFFConstants.PHOTOMETRIC_RGB) {
img.setColorTransform(0);
}
}
else {