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