1 /*
2 * Licensed under the Apache License, Version 2.0 (the "License");
3 * you may not use this file except in compliance with the License.
4 * You may obtain a copy of the License at
5 *
6 * http://www.apache.org/licenses/LICENSE-2.0
7 *
8 * Unless required by applicable law or agreed to in writing, software
9 * distributed under the License is distributed on an "AS IS" BASIS,
10 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11 * See the License for the specific language governing permissions and
12 * limitations under the License.
13 * under the License.
14 */
15
16 package org.apache.commons.imaging.formats.tiff;
17
18 import org.apache.commons.imaging.common.XmpImagingParameters;
19 import org.apache.commons.imaging.formats.tiff.photometricinterpreters.AbstractPhotometricInterpreter;
20 import org.apache.commons.imaging.formats.tiff.write.TiffOutputSet;
21
22 /**
23 * TIFF format parameters.
24 *
25 * @since 1.0-alpha3
26 */
27 public class TiffImagingParameters extends XmpImagingParameters<TiffImagingParameters> {
28
29 /**
30 * Indicates whether to read embedded thumbnails or not. Only applies to read EXIF metadata from JPEG/JFIF files.
31 *
32 * <p>
33 * Default value is {@code true}.
34 * </p>
35 */
36 private boolean readThumbnails = true;
37
38 /**
39 * User provided {@code TiffOutputSet} used to write into the image's metadata including standard directory and EXIF tags.
40 */
41 private TiffOutputSet tiffOutputSet;
42
43 /**
44 * X-coordinate of a sub-image.
45 */
46 private int subImageX;
47
48 /**
49 * Y-coordinate of a sub-image.
50 */
51 private int subImageY;
52
53 /**
54 * Width of a sub-image.
55 */
56 private int subImageWidth;
57
58 /**
59 * Height of a sub-image.
60 */
61 private int subImageHeight;
62
63 /**
64 * Specifies that an application-specified photometric interpreter is to be used when reading TIFF files to convert raster data samples to RGB values for
65 * the output image.
66 *
67 * <p>
68 * The value supplied with this key should be a valid instance of a class that implements PhotometricInterpreter.
69 * </p>
70 */
71 private AbstractPhotometricInterpreter customPhotometricInterpreter;
72
73 /**
74 * TIFF compression algorithm, if any.
75 */
76 private Integer compression;
77
78 /**
79 * Specifies the amount of memory in bytes to be used for a strip or tile size when employing LZW compression. The default is 8000 (roughly 8K). Minimum
80 * value is 8000.
81 */
82 private Integer lzwCompressionBlockSize;
83
84 /**
85 * Used in write operations to indicate the desired T.4 options to use when using TIFF_COMPRESSION_CCITT_GROUP_3.
86 *
87 * <p>
88 * Valid values: any Integer containing a mixture of the TIFF_FLAG_T4_OPTIONS_2D, TIFF_FLAG_T4_OPTIONS_UNCOMPRESSED_MODE, and TIFF_FLAG_T4_OPTIONS_FILL
89 * flags.
90 * </p>
91 */
92 private Integer t4Options;
93
94 /**
95 * Used in write operations to indicate the desired T.6 options to use when using TIFF_COMPRESSION_CCITT_GROUP_4.
96 *
97 * <p>
98 * Valid values: any Integer containing either zero or TIFF_FLAG_T6_OPTIONS_UNCOMPRESSED_MODE.
99 * </p>
100 */
101 private Integer t6Options;
102
103 /**
104 * Clears settings for sub-image. Subsequent read operations will retrieve the entire image.
105 */
106 public void clearSubImage() {
107 subImageWidth = 0;
108 subImageHeight = 0;
109 }
110
111 public Integer getCompression() {
112 return compression;
113 }
114
115 public AbstractPhotometricInterpreter getCustomPhotometricInterpreter() {
116 return customPhotometricInterpreter;
117 }
118
119 public Integer getLzwCompressionBlockSize() {
120 return lzwCompressionBlockSize;
121 }
122
123 /**
124 * Gets the TIFF output set for writing TIFF files.
125 *
126 * @return if set, a valid instance; otherwise, a null reference.
127 */
128 public TiffOutputSet getOutputSet() {
129 return tiffOutputSet;
130 }
131
132 /**
133 * Gets the height for a sub-image setting. For a sub-image setting to be meaningful, both the width and height must be set.
134 *
135 * @return if the sub-image feature is enabled, a value greater than zero; otherwise, zero.
136 */
137 public int getSubImageHeight() {
138 return subImageHeight;
139 }
140
141 /**
142 * Gets the width for a sub-image setting. For a sub-image setting to be meaningful, both the width and height must be set.
143 *
144 * @return if the sub-image feature is enabled, a value greater than zero; otherwise, zero.
145 */
146 public int getSubImageWidth() {
147 return subImageWidth;
148 }
149
150 /**
151 * Gets the X coordinate of a sub-image. This setting is meaningful only if a sub-image is set.
152 *
153 * @return a positive integer
154 */
155 public int getSubImageX() {
156 return subImageX;
157 }
158
159 /**
160 * Gets the Y coordinate of a sub-image. This setting is meaningful only if a sub-image is set.
161 *
162 * @return a positive integer
163 */
164 public int getSubImageY() {
165 return subImageY;
166 }
167
168 public Integer getT4Options() {
169 return t4Options;
170 }
171
172 public Integer getT6Options() {
173 return t6Options;
174 }
175
176 public boolean isReadThumbnails() {
177 return readThumbnails;
178 }
179
180 /**
181 * Indicates whether the application has set sub-image parameters.
182 *
183 * @return true if the sub-image parameters are set; otherwise, false.
184 */
185 public boolean isSubImageSet() {
186 return subImageWidth > 0 && subImageHeight > 0;
187 }
188
189 public TiffImagingParameters setCompression(final Integer compression) {
190 this.compression = compression;
191 return asThis();
192 }
193
194 public TiffImagingParameters setCustomPhotometricInterpreter(final AbstractPhotometricInterpreter customPhotometricInterpreter) {
195 this.customPhotometricInterpreter = customPhotometricInterpreter;
196 return asThis();
197 }
198
199 public TiffImagingParameters setLzwCompressionBlockSize(final Integer lzwCompressionBlockSize) {
200 this.lzwCompressionBlockSize = lzwCompressionBlockSize;
201 return asThis();
202 }
203
204 /**
205 * Sets the TIFF output set for writing TIFF files. An output set may contain various types of TiffDirectories including image directories, EXIF
206 * directories, GPS-related directories, etc.
207 *
208 * @param tiffOutputSet A valid instance.
209 * @return {@code this} instance.
210 */
211 public TiffImagingParameters setOutputSet(final TiffOutputSet tiffOutputSet) {
212 this.tiffOutputSet = tiffOutputSet;
213 return asThis();
214 }
215
216 public TiffImagingParameters setReadThumbnails(final boolean readThumbnails) {
217 this.readThumbnails = readThumbnails;
218 return asThis();
219 }
220
221 /**
222 * Sets parameters for performing a partial read operation on an image. This method is useful for reducing memory and run-time overhead when accessing large
223 * source images.
224 * <p>
225 * Note that the corner x and y coordinates must be positive integers (zero or greater). The width and height must be greater than zero.
226 *
227 * @param x pixel coordinate of the upper-left corner of the source image, must be zero or greater.
228 * @param y pixel coordinate of the upper-left corner of the source image, must be zero or greater.
229 * @param width width of the image subset to be read, must be greater than zero.
230 * @param height height of the image subset to be read, must be greater than zero.
231 * @return {@code this} instance.
232 */
233 public TiffImagingParameters setSubImage(final int x, final int y, final int width, final int height) {
234 if (x < 0 || y < 0) {
235 throw new IllegalArgumentException("Invalid sub-image specification: negative x and y values not allowed");
236 }
237 if (width <= 0 || height <= 0) {
238 throw new IllegalArgumentException("Invalid sub-image specification width and height must be greater than zero");
239 }
240 subImageX = x;
241 subImageY = y;
242 subImageWidth = width;
243 subImageHeight = height;
244 return asThis();
245 }
246
247 public TiffImagingParameters setT4Options(final Integer t4Options) {
248 this.t4Options = t4Options;
249 return asThis();
250 }
251
252 public TiffImagingParameters setT6Options(final Integer t6Options) {
253 this.t6Options = t6Options;
254 return asThis();
255 }
256
257 }