if (metadata instanceof TIFFImageMetadata) {
TIFFImageMetadata tim = (TIFFImageMetadata)metadata;
TIFFIFD rootIFD = tim.getRootIFD();
BaselineTIFFTagSet base = BaselineTIFFTagSet.getInstance();
TIFFField f =
tim.getTIFFField(BaselineTIFFTagSet.TAG_SAMPLES_PER_PIXEL);
int numBands = f.getAsInt(0);
if(numBands == 1) {
// Remove YCbCr fields not relevant for grayscale.
rootIFD.removeTIFFField(BaselineTIFFTagSet.TAG_Y_CB_CR_SUBSAMPLING);
rootIFD.removeTIFFField(BaselineTIFFTagSet.TAG_Y_CB_CR_POSITIONING);
rootIFD.removeTIFFField(BaselineTIFFTagSet.TAG_REFERENCE_BLACK_WHITE);
} else { // numBands == 3
// Replace YCbCr fields.
// YCbCrSubSampling
TIFFField YCbCrSubSamplingField = new TIFFField
(base.getTag(BaselineTIFFTagSet.TAG_Y_CB_CR_SUBSAMPLING),
TIFFTag.TIFF_SHORT, 2,
new char[] {CHROMA_SUBSAMPLING, CHROMA_SUBSAMPLING});
rootIFD.addTIFFField(YCbCrSubSamplingField);
// YCbCrPositioning
TIFFField YCbCrPositioningField = new TIFFField
(base.getTag(BaselineTIFFTagSet.TAG_Y_CB_CR_POSITIONING),
TIFFTag.TIFF_SHORT, 1,
new char[]
{BaselineTIFFTagSet.Y_CB_CR_POSITIONING_CENTERED});
rootIFD.addTIFFField(YCbCrPositioningField);
// ReferenceBlackWhite
TIFFField referenceBlackWhiteField = new TIFFField
(base.getTag(BaselineTIFFTagSet.TAG_REFERENCE_BLACK_WHITE),
TIFFTag.TIFF_RATIONAL, 6,
new long[][] { // no headroon/footroom
{0, 1}, {255, 1},
{128, 1}, {255, 1},
{128, 1}, {255, 1}
});
rootIFD.addTIFFField(referenceBlackWhiteField);
}
// JPEGTables field is written if and only if one is
// already present in the metadata. If one is present
// and has either zero length or does not represent a
// valid tables-only stream, then a JPEGTables field
// will be written initialized to the standard tables-
// only stream written by the JPEG writer.
// Retrieve the JPEGTables field.
TIFFField JPEGTablesField =
tim.getTIFFField(BaselineTIFFTagSet.TAG_JPEG_TABLES);
// Initialize JPEG writer to one supporting abbreviated streams.
if(JPEGTablesField != null) {
// Intialize the JPEG writer to one that supports stream
// metadata, i.e., abbreviated streams, and may or may not
// support image metadata.
initJPEGWriter(true, false);
}
// Write JPEGTables field if a writer supporting abbreviated
// streams was available.
if(JPEGTablesField != null && JPEGWriter != null) {
if(DEBUG) System.out.println("Has JPEGTables ...");
// Set the abbreviated stream flag.
this.writeAbbreviatedStream = true;
//Branch based on field value count.
if(JPEGTablesField.getCount() > 0) {
if(DEBUG) System.out.println("JPEGTables > 0");
// Derive the stream metadata from the field.
// Get the field values.
byte[] tables = JPEGTablesField.getAsBytes();
// Create an input stream for the tables.
ByteArrayInputStream bais =
new ByteArrayInputStream(tables);
MemoryCacheImageInputStream iis =
new MemoryCacheImageInputStream(bais);
// Read the tables stream using the JPEG reader.
ImageReader jpegReader = getJPEGTablesReader();
jpegReader.setInput(iis);
// Initialize the stream metadata object.
try {
JPEGStreamMetadata = jpegReader.getStreamMetadata();
} catch(Exception e) {
// Fall back to default tables.
JPEGStreamMetadata = null;
} finally {
jpegReader.reset();
}
if(DEBUG) System.out.println(JPEGStreamMetadata);
}
if(JPEGStreamMetadata == null) {
if(DEBUG) System.out.println("JPEGTables == 0");
// Derive the field from default stream metadata.
// Get default stream metadata.
JPEGStreamMetadata =
JPEGWriter.getDefaultStreamMetadata(JPEGParam);
// Create an output stream for the tables.
ByteArrayOutputStream tableByteStream =
new ByteArrayOutputStream();
MemoryCacheImageOutputStream tableStream =
new MemoryCacheImageOutputStream(tableByteStream);
// Write a tables-only stream.
JPEGWriter.setOutput(tableStream);
try {
JPEGWriter.prepareWriteSequence(JPEGStreamMetadata);
tableStream.flush();
JPEGWriter.endWriteSequence();
// Get the tables-only stream content.
byte[] tables = tableByteStream.toByteArray();
if(DEBUG) System.out.println("tables.length = "+
tables.length);
// Add the JPEGTables field.
JPEGTablesField = new TIFFField
(base.getTag(BaselineTIFFTagSet.TAG_JPEG_TABLES),
TIFFTag.TIFF_UNDEFINED,
tables.length,
tables);
rootIFD.addTIFFField(JPEGTablesField);