in src/main/java/org/apache/commons/imaging/formats/tiff/write/TiffOutputDirectory.java [589:686]
protected List<TiffOutputItem> 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,
FieldType.LONG, 1, new byte[TIFF_ENTRY_MAX_VALUE_LENGTH]);
add(jpegOffsetField);
final byte[] lengthValue = FieldType.LONG.writeData(
jpegImageData.length,
outputSummary.byteOrder);
final TiffOutputField jpegLengthField = new TiffOutputField(
TiffTagConstants.TIFF_TAG_JPEG_INTERCHANGE_FORMAT_LENGTH,
FieldType.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);
TiffOutputField imageDataOffsetField;
ImageDataOffsets imageDataInfo = null;
if (null != tiffImageData) {
final boolean stripsNotTiles = tiffImageData.stripsNotTiles();
TagInfo offsetTag;
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 TiffElement.DataElement[] imageData = tiffImageData.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,
FieldType.LONG, imageDataOffsets.length,
FieldType.LONG.writeData(imageDataOffsets,
outputSummary.byteOrder));
add(imageDataOffsetField);
final byte[] data = FieldType.LONG.writeData(imageDataByteCounts, outputSummary.byteOrder);
final TiffOutputField byteCountsField = new TiffOutputField(
byteCountsTag, FieldType.LONG, imageDataByteCounts.length,
data);
add(byteCountsField);
imageDataInfo = new ImageDataOffsets(imageData, imageDataOffsets, imageDataOffsetField);
}
final List<TiffOutputItem> result = new ArrayList<>();
result.add(this);
sortFields();
for (final TiffOutputField field : fields) {
if (field.isLocalValue()) {
continue;
}
final TiffOutputItem 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 TiffOutputItem item = new TiffOutputItem.Value("JPEG image data",
jpegImageData.getData());
result.add(item);
outputSummary.add(item, jpegOffsetField);
}
return result;
}