in src/main/java/org/apache/commons/imaging/formats/tiff/write/TiffOutputDirectory.java [456:543]
protected List<AbstractTiffOutputItem> getOutputItems(final TiffOutputSummary outputSummary) throws ImagingException {
// first validate directory fields.
removeFieldIfPresent(TiffTagConstants.TIFF_TAG_JPEG_INTERCHANGE_FORMAT);
removeFieldIfPresent(TiffTagConstants.TIFF_TAG_JPEG_INTERCHANGE_FORMAT_LENGTH);
TiffOutputField jpegOffsetField = null;
if (null != jpegImageData) {
jpegOffsetField = new TiffOutputField(TiffTagConstants.TIFF_TAG_JPEG_INTERCHANGE_FORMAT, AbstractFieldType.LONG, 1,
new byte[ENTRY_MAX_VALUE_LENGTH]);
add(jpegOffsetField);
final byte[] lengthValue = AbstractFieldType.LONG.writeData(jpegImageData.length, outputSummary.byteOrder);
final TiffOutputField jpegLengthField = new TiffOutputField(TiffTagConstants.TIFF_TAG_JPEG_INTERCHANGE_FORMAT_LENGTH, AbstractFieldType.LONG, 1,
lengthValue);
add(jpegLengthField);
}
removeFieldIfPresent(TiffTagConstants.TIFF_TAG_STRIP_OFFSETS);
removeFieldIfPresent(TiffTagConstants.TIFF_TAG_STRIP_BYTE_COUNTS);
removeFieldIfPresent(TiffTagConstants.TIFF_TAG_TILE_OFFSETS);
removeFieldIfPresent(TiffTagConstants.TIFF_TAG_TILE_BYTE_COUNTS);
final TiffOutputField imageDataOffsetField;
ImageDataOffsets imageDataInfo = null;
if (null != abstractTiffImageData) {
final boolean stripsNotTiles = abstractTiffImageData.stripsNotTiles();
final TagInfo offsetTag;
final TagInfo byteCountsTag;
if (stripsNotTiles) {
offsetTag = TiffTagConstants.TIFF_TAG_STRIP_OFFSETS;
byteCountsTag = TiffTagConstants.TIFF_TAG_STRIP_BYTE_COUNTS;
} else {
offsetTag = TiffTagConstants.TIFF_TAG_TILE_OFFSETS;
byteCountsTag = TiffTagConstants.TIFF_TAG_TILE_BYTE_COUNTS;
}
final AbstractTiffElement.DataElement[] imageData = abstractTiffImageData.getImageData();
// TiffOutputField imageDataOffsetsField = null;
final int[] imageDataOffsets = Allocator.intArray(imageData.length);
final int[] imageDataByteCounts = Allocator.intArray(imageData.length);
Arrays.setAll(imageDataByteCounts, i -> imageData[i].length);
// Append imageData-related fields to first directory
imageDataOffsetField = new TiffOutputField(offsetTag, AbstractFieldType.LONG, imageDataOffsets.length,
AbstractFieldType.LONG.writeData(imageDataOffsets, outputSummary.byteOrder));
add(imageDataOffsetField);
final byte[] data = AbstractFieldType.LONG.writeData(imageDataByteCounts, outputSummary.byteOrder);
final TiffOutputField byteCountsField = new TiffOutputField(byteCountsTag, AbstractFieldType.LONG, imageDataByteCounts.length, data);
add(byteCountsField);
imageDataInfo = new ImageDataOffsets(imageData, imageDataOffsets, imageDataOffsetField);
}
final List<AbstractTiffOutputItem> result = new ArrayList<>();
result.add(this);
sortFields();
for (final TiffOutputField field : fields) {
if (field.isLocalValue()) {
continue;
}
final AbstractTiffOutputItem item = field.getSeperateValue();
result.add(item);
// outputSummary.add(item, field);
}
if (null != imageDataInfo) {
Collections.addAll(result, imageDataInfo.outputItems);
outputSummary.addTiffImageData(imageDataInfo);
}
if (null != jpegImageData) {
final AbstractTiffOutputItem item = new AbstractTiffOutputItem.Value("JPEG image data", jpegImageData.getData());
result.add(item);
outputSummary.add(item, jpegOffsetField);
}
return result;
}