1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.imaging.formats.tiff.write;
18
19 import static org.apache.commons.imaging.formats.tiff.constants.TiffConstants.TIFF_HEADER_SIZE;
20
21 import java.io.IOException;
22 import java.io.OutputStream;
23 import java.nio.ByteOrder;
24 import java.util.List;
25
26 import org.apache.commons.imaging.ImagingException;
27 import org.apache.commons.imaging.common.BinaryOutputStream;
28
29 public class TiffImageWriterLossy extends AbstractTiffImageWriter {
30
31 public TiffImageWriterLossy() {
32
33 }
34
35 public TiffImageWriterLossy(final ByteOrder byteOrder) {
36 super(byteOrder);
37 }
38
39 private void updateOffsetsStep(final List<AbstractTiffOutputItem> outputItems) {
40 int offset = TIFF_HEADER_SIZE;
41
42 for (final AbstractTiffOutputItem outputItem : outputItems) {
43 outputItem.setOffset(offset);
44 final int itemLength = outputItem.getItemLength();
45 offset += itemLength;
46
47 final int remainder = imageDataPaddingLength(itemLength);
48 offset += remainder;
49 }
50 }
51
52 @Override
53 public void write(final OutputStream os, final TiffOutputSet outputSet) throws IOException, ImagingException {
54 final TiffOutputSummary outputSummary = validateDirectories(outputSet);
55
56 final List<AbstractTiffOutputItem> outputItems = outputSet.getOutputItems(outputSummary);
57
58 updateOffsetsStep(outputItems);
59
60 outputSummary.updateOffsets(byteOrder);
61
62 final BinaryOutputStream bos = BinaryOutputStream.create(os, byteOrder);
63
64
65 writeStep(bos, outputItems);
66 }
67
68 private void writeStep(final BinaryOutputStream bos, final List<AbstractTiffOutputItem> outputItems) throws IOException, ImagingException {
69 writeImageFileHeader(bos);
70
71 for (final AbstractTiffOutputItem outputItem : outputItems) {
72 outputItem.writeItem(bos);
73
74 final int length = outputItem.getItemLength();
75
76 final int remainder = imageDataPaddingLength(length);
77 for (int j = 0; j < remainder; j++) {
78 bos.write(0);
79 }
80 }
81
82 }
83 }