1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.imaging.examples.tiff;
18
19 import java.awt.Color;
20 import java.awt.image.BufferedImage;
21 import java.io.File;
22 import java.io.IOException;
23 import java.util.ArrayList;
24 import java.util.List;
25
26 import javax.imageio.ImageIO;
27
28 import org.apache.commons.imaging.FormatCompliance;
29 import org.apache.commons.imaging.ImagingException;
30 import org.apache.commons.imaging.bytesource.ByteSource;
31 import org.apache.commons.imaging.common.ImageBuilder;
32 import org.apache.commons.imaging.formats.tiff.AbstractTiffRasterData;
33 import org.apache.commons.imaging.formats.tiff.TiffContents;
34 import org.apache.commons.imaging.formats.tiff.TiffDirectory;
35 import org.apache.commons.imaging.formats.tiff.TiffImagingParameters;
36 import org.apache.commons.imaging.formats.tiff.TiffRasterStatistics;
37 import org.apache.commons.imaging.formats.tiff.TiffReader;
38 import org.apache.commons.imaging.formats.tiff.photometricinterpreters.floatingpoint.PaletteEntry;
39 import org.apache.commons.imaging.formats.tiff.photometricinterpreters.floatingpoint.PaletteEntryForRange;
40 import org.apache.commons.imaging.formats.tiff.photometricinterpreters.floatingpoint.PaletteEntryForValue;
41 import org.apache.commons.imaging.formats.tiff.photometricinterpreters.floatingpoint.PhotometricInterpreterFloat;
42 import org.apache.commons.lang3.StringUtils;
43
44
45
46
47
48 public class ExampleReadFloatingPointData {
49
50 private static final String[] USAGE = { "Usage ReadFloatingPointData <input file> [output file]", " input file: Mandatory file to be read",
51 " output file: Optional output path for file to be written.", " This name should not include a file extension.",
52 " Output data will be written using the JPEG format." };
53
54
55
56
57
58
59
60
61 public static void main(final String[] args) throws ImagingException, IOException {
62 if (args.length == 0) {
63
64 for (final String s : USAGE) {
65 System.err.println(s);
66 }
67 System.exit(0);
68 }
69
70 final File target = new File(args[0]);
71 String outputPath = null;
72 if (args.length >= 2) {
73 outputPath = args[1];
74 }
75 final boolean optionalImageWritingEnabled = StringUtils.isNotEmpty(outputPath);
76
77 final ByteSource byteSource = ByteSource.file(target);
78
79
80
81
82 final TiffReader tiffReader = new TiffReader(true);
83
84
85
86
87
88
89 final TiffContents contents = tiffReader.readDirectories(byteSource, true,
90 FormatCompliance.getDefault());
91
92
93
94
95 final TiffDirectory directory = contents.directories.get(0);
96
97 if (!directory.hasTiffFloatingPointRasterData()) {
98 System.err.println("Specified directory does not contain floating-point data");
99 System.exit(-1);
100 }
101
102
103
104
105
106 final long time0Nanos = System.nanoTime();
107 final TiffImagingParameters params = new TiffImagingParameters();
108 final AbstractTiffRasterData rasterData = directory.getRasterData(params);
109 final long time1Nanos = System.nanoTime();
110 System.out.println("Data read in " + (time1Nanos - time0Nanos) / 1.0e+6 + " ms");
111
112
113
114
115 final float excludedValue = Float.NaN;
116 final TiffRasterStatistics simpleStats;
117 if ("Sample64BitFloatingPointPix451x337.tiff".equals(target.getName())) {
118 simpleStats = rasterData.getSimpleStatistics(9999);
119 } else {
120
121 simpleStats = rasterData.getSimpleStatistics();
122 }
123
124 final int w = rasterData.getWidth();
125 final int h = rasterData.getHeight();
126 final float minValue = simpleStats.getMinValue();
127 final float maxValue = simpleStats.getMaxValue();
128
129 System.out.format("Image size %dx%d%n", w, h);
130 System.out.format("Range of values in TIFF: %f %f%n", minValue, maxValue);
131 System.out.format("Number of data values found %d%n", simpleStats.getCountOfSamples());
132
133 if (optionalImageWritingEnabled) {
134
135
136
137
138
139
140 final File output = new File(outputPath);
141 System.out.println("Writing image to " + output.getPath());
142
143
144 final List<PaletteEntry> paletteList = new ArrayList<>();
145 if (!Float.isNaN(excludedValue)) {
146
147 paletteList.add(new PaletteEntryForValue(excludedValue, Color.red));
148 }
149 paletteList.add(new PaletteEntryForRange(minValue, maxValue, Color.black, Color.white));
150
151
152
153
154 paletteList.add(new PaletteEntryForValue(maxValue, Color.white));
155 final PhotometricInterpreterFloat photometricInterpreter = new PhotometricInterpreterFloat(paletteList);
156
157
158 final ImageBuilder builder = new ImageBuilder(w, h, false);
159 for (int y = 0; y < h; y++) {
160 for (int x = 0; x < w; x++) {
161 final float f = rasterData.getValue(x, y);
162 final int argb = photometricInterpreter.mapValueToArgb(f);
163 builder.setRgb(x, y, argb);
164 }
165 }
166
167 final BufferedImage bImage = builder.getBufferedImage();
168 ImageIO.write(bImage, "JPEG", output);
169 }
170 }
171 }