annotate common/src/main/java/digilib/image/ImageJobDescription.java @ 912:cbfc94584d3b

reset imgSize in operations that change size.
author robcast
date Wed, 08 Jun 2011 17:49:01 +0200
parents 28d007673346
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
557
0885f5ca5b24 more refactoring and rearranging
robcast
parents: 555
diff changeset
1 package digilib.image;
500
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
2
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
3 import java.awt.geom.AffineTransform;
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
4 import java.awt.geom.Rectangle2D;
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
5 import java.io.IOException;
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
6
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
7 import org.apache.log4j.Logger;
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
8
829
a630d0303cce new servlet operation colop=grayscale.
robcast
parents: 819
diff changeset
9 import digilib.image.DocuImage.ColorOp;
500
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
10 import digilib.io.DocuDirCache;
541
f140d5ee8c0b new NumRange class
robcast
parents: 531
diff changeset
11 import digilib.io.DocuDirectory;
500
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
12 import digilib.io.FileOpException;
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
13 import digilib.io.FileOps;
563
686086d6e6d6 more refactoring and rearranging
robcast
parents: 562
diff changeset
14 import digilib.io.FileOps.FileClass;
576
dad720e9b12b try: DocuDirent as interface, ImageFile inherits from ImageInput and implements DocuDirent
robcast
parents: 574
diff changeset
15 import digilib.io.ImageInput;
574
790cbfb58b52 ripping apart ImageFileSet
robcast
parents: 565
diff changeset
16 import digilib.io.ImageSet;
557
0885f5ca5b24 more refactoring and rearranging
robcast
parents: 555
diff changeset
17 import digilib.servlet.DigilibConfiguration;
596
2b58d2783ef0 small cleanup
robcast
parents: 593
diff changeset
18 import digilib.util.ImageSize;
557
0885f5ca5b24 more refactoring and rearranging
robcast
parents: 555
diff changeset
19 import digilib.util.OptionsSet;
0885f5ca5b24 more refactoring and rearranging
robcast
parents: 555
diff changeset
20 import digilib.util.Parameter;
0885f5ca5b24 more refactoring and rearranging
robcast
parents: 555
diff changeset
21 import digilib.util.ParameterMap;
500
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
22
593
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
23 /**
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
24 * A class for storing the set of parameters necessary for scaling images
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
25 * with an ImageWorker.
500
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
26 *
593
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
27 * This contains the functionality formerly found in Scaler.processRequest(),
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
28 * only factorized.
500
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
29 *
547
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
30 * @author cmielack, casties
593
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
31 *
500
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
32 */
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
33
547
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
34 public class ImageJobDescription extends ParameterMap {
500
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
35
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
36 DigilibConfiguration dlConfig = null;
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
37 protected static Logger logger = Logger.getLogger("digilib.servlet");
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
38
593
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
39 ImageInput input = null;
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
40 ImageSet imageSet = null;
541
f140d5ee8c0b new NumRange class
robcast
parents: 531
diff changeset
41 DocuDirectory fileDir = null;
906
28d007673346 really works with streams now.
robcast
parents: 903
diff changeset
42 DocuImage docuImage = null;
541
f140d5ee8c0b new NumRange class
robcast
parents: 531
diff changeset
43 String filePath = null;
500
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
44 ImageSize expectedSourceSize = null;
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
45 Float scaleXY = null;
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
46 Rectangle2D userImgArea = null;
589
73e041c710d3 more work on stream input
robcast
parents: 585
diff changeset
47 Rectangle2D outerUserImgArea = null;
502
157d4c7d2343 readded support for direct sending of image files
cmielack
parents: 500
diff changeset
48 Boolean imageSendable = null;
593
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
49 String mimeType = null;
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
50 Integer paramDW = null;
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
51 Integer paramDH = null;
547
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
52
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
53 /** create empty ImageJobDescription.
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
54 * @param dlcfg
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
55 */
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
56 public ImageJobDescription(DigilibConfiguration dlcfg) {
500
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
57 super(30);
547
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
58 dlConfig = dlcfg;
552
785fc58b68b1 more cleanup and refactoring
robcast
parents: 547
diff changeset
59 }
785fc58b68b1 more cleanup and refactoring
robcast
parents: 547
diff changeset
60
785fc58b68b1 more cleanup and refactoring
robcast
parents: 547
diff changeset
61
785fc58b68b1 more cleanup and refactoring
robcast
parents: 547
diff changeset
62 /** set up Parameters
557
0885f5ca5b24 more refactoring and rearranging
robcast
parents: 555
diff changeset
63 * @see digilib.util.ParameterMap#initParams()
552
785fc58b68b1 more cleanup and refactoring
robcast
parents: 547
diff changeset
64 */
785fc58b68b1 more cleanup and refactoring
robcast
parents: 547
diff changeset
65 @Override
785fc58b68b1 more cleanup and refactoring
robcast
parents: 547
diff changeset
66 protected void initParams() {
500
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
67 // url of the page/document (second part)
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
68 newParameter("fn", "", null, 's');
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
69 // page number
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
70 newParameter("pn", new Integer(1), null, 's');
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
71 // width of client in pixels
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
72 newParameter("dw", new Integer(0), null, 's');
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
73 // height of client in pixels
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
74 newParameter("dh", new Integer(0), null, 's');
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
75 // left edge of image (float from 0 to 1)
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
76 newParameter("wx", new Float(0), null, 's');
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
77 // top edge in image (float from 0 to 1)
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
78 newParameter("wy", new Float(0), null, 's');
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
79 // width of image (float from 0 to 1)
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
80 newParameter("ww", new Float(1), null, 's');
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
81 // height of image (float from 0 to 1)
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
82 newParameter("wh", new Float(1), null, 's');
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
83 // scale factor
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
84 newParameter("ws", new Float(1), null, 's');
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
85 // special options like 'fit' for gifs
547
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
86 newParameter("mo", this.options, null, 's');
500
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
87 // rotation angle (degree)
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
88 newParameter("rot", new Float(0), null, 's');
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
89 // contrast enhancement factor
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
90 newParameter("cont", new Float(0), null, 's');
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
91 // brightness enhancement factor
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
92 newParameter("brgt", new Float(0), null, 's');
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
93 // color multiplicative factors
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
94 newParameter("rgbm", "0/0/0", null, 's');
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
95 // color additive factors
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
96 newParameter("rgba", "0/0/0", null, 's');
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
97 // display dpi resolution (total)
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
98 newParameter("ddpi", new Float(0), null, 's');
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
99 // display dpi X resolution
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
100 newParameter("ddpix", new Float(0), null, 's');
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
101 // display dpi Y resolution
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
102 newParameter("ddpiy", new Float(0), null, 's');
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
103 // scale factor for mo=ascale
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
104 newParameter("scale", new Float(1), null, 's');
829
a630d0303cce new servlet operation colop=grayscale.
robcast
parents: 819
diff changeset
105 // color conversion operation
a630d0303cce new servlet operation colop=grayscale.
robcast
parents: 819
diff changeset
106 newParameter("colop", "", null, 's');
500
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
107 }
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
108
503
fdb824bd57ab first functional version of PDFCache after restructuring the code
cmielack
parents: 502
diff changeset
109
552
785fc58b68b1 more cleanup and refactoring
robcast
parents: 547
diff changeset
110 /* (non-Javadoc)
785fc58b68b1 more cleanup and refactoring
robcast
parents: 547
diff changeset
111 * @see digilib.servlet.ParameterMap#initOptions()
547
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
112 */
552
785fc58b68b1 more cleanup and refactoring
robcast
parents: 547
diff changeset
113 @Override
785fc58b68b1 more cleanup and refactoring
robcast
parents: 547
diff changeset
114 protected void initOptions() {
565
8beefd1142b2 more cleanup
robcast
parents: 564
diff changeset
115 String s = this.getAsString("mo");
8beefd1142b2 more cleanup
robcast
parents: 564
diff changeset
116 options = new OptionsSet(s);
500
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
117 }
552
785fc58b68b1 more cleanup and refactoring
robcast
parents: 547
diff changeset
118
785fc58b68b1 more cleanup and refactoring
robcast
parents: 547
diff changeset
119
785fc58b68b1 more cleanup and refactoring
robcast
parents: 547
diff changeset
120 /** Creates new ImageJobDescription by merging Parameters from another ParameterMap.
785fc58b68b1 more cleanup and refactoring
robcast
parents: 547
diff changeset
121 * @param pm
785fc58b68b1 more cleanup and refactoring
robcast
parents: 547
diff changeset
122 * @param dlcfg
785fc58b68b1 more cleanup and refactoring
robcast
parents: 547
diff changeset
123 * @return
785fc58b68b1 more cleanup and refactoring
robcast
parents: 547
diff changeset
124 */
557
0885f5ca5b24 more refactoring and rearranging
robcast
parents: 555
diff changeset
125 public static ImageJobDescription getInstance(ParameterMap pm, DigilibConfiguration dlcfg) {
552
785fc58b68b1 more cleanup and refactoring
robcast
parents: 547
diff changeset
126 ImageJobDescription newMap = new ImageJobDescription(dlcfg);
785fc58b68b1 more cleanup and refactoring
robcast
parents: 547
diff changeset
127 // add all params to this map
557
0885f5ca5b24 more refactoring and rearranging
robcast
parents: 555
diff changeset
128 newMap.params.putAll(pm.getParams());
552
785fc58b68b1 more cleanup and refactoring
robcast
parents: 547
diff changeset
129 newMap.initOptions();
785fc58b68b1 more cleanup and refactoring
robcast
parents: 547
diff changeset
130 return newMap;
785fc58b68b1 more cleanup and refactoring
robcast
parents: 547
diff changeset
131 }
785fc58b68b1 more cleanup and refactoring
robcast
parents: 547
diff changeset
132
500
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
133
593
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
134 /** Returns the mime-type (of the input).
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
135 * @return
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
136 * @throws IOException
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
137 */
547
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
138 public String getMimeType() throws IOException {
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
139 if (mimeType == null) {
593
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
140 input = getInput();
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
141 mimeType = input.getMimetype();
502
157d4c7d2343 readded support for direct sending of image files
cmielack
parents: 500
diff changeset
142 }
500
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
143 return mimeType;
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
144 }
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
145
906
28d007673346 really works with streams now.
robcast
parents: 903
diff changeset
146 /**
28d007673346 really works with streams now.
robcast
parents: 903
diff changeset
147 * @param input the input to set
28d007673346 really works with streams now.
robcast
parents: 903
diff changeset
148 */
28d007673346 really works with streams now.
robcast
parents: 903
diff changeset
149 public void setInput(ImageInput input) {
28d007673346 really works with streams now.
robcast
parents: 903
diff changeset
150 this.input = input;
28d007673346 really works with streams now.
robcast
parents: 903
diff changeset
151 }
28d007673346 really works with streams now.
robcast
parents: 903
diff changeset
152
28d007673346 really works with streams now.
robcast
parents: 903
diff changeset
153
28d007673346 really works with streams now.
robcast
parents: 903
diff changeset
154 /** Returns the ImageInput to use.
593
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
155 * @return
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
156 * @throws IOException
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
157 */
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
158 public ImageInput getInput() throws IOException {
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
159 if(input == null){
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
160 imageSet = getImageSet();
500
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
161
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
162 /* select a resolution */
593
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
163 if (isHiresOnly()) {
500
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
164 // get first element (= highest resolution)
593
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
165 input = imageSet.getBiggest();
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
166 } else if (isLoresOnly()) {
500
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
167 // enforced lores uses next smaller resolution
593
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
168 input = imageSet.getNextSmaller(getExpectedSourceSize());
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
169 if (input == null) {
500
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
170 // this is the smallest we have
593
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
171 input = imageSet.getSmallest();
500
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
172 }
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
173 } else {
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
174 // autores: use next higher resolution
593
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
175 input = imageSet.getNextBigger(getExpectedSourceSize());
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
176 if (input == null) {
500
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
177 // this is the highest we have
593
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
178 input = imageSet.getBiggest();
500
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
179 }
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
180 }
819
a23c4c15a6a8 clean up possible resource leaks. better behaviour with unknown image types.
robcast
parents: 774
diff changeset
181 if (input == null || input.getMimetype() == null) {
a23c4c15a6a8 clean up possible resource leaks. better behaviour with unknown image types.
robcast
parents: 774
diff changeset
182 throw new FileOpException("Unable to load "+input);
a23c4c15a6a8 clean up possible resource leaks. better behaviour with unknown image types.
robcast
parents: 774
diff changeset
183 }
a23c4c15a6a8 clean up possible resource leaks. better behaviour with unknown image types.
robcast
parents: 774
diff changeset
184 logger.info("Planning to load: " + input);
500
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
185 }
593
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
186 return input;
500
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
187 }
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
188
593
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
189 /** Returns the DocuDirectory for the input (file).
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
190 * @return
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
191 * @throws FileOpException
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
192 */
557
0885f5ca5b24 more refactoring and rearranging
robcast
parents: 555
diff changeset
193 public DocuDirectory getFileDirectory() throws FileOpException {
555
88ed97d08b97 still refactoring
robcast
parents: 552
diff changeset
194 if(fileDir == null){
500
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
195 DocuDirCache dirCache = (DocuDirCache) dlConfig.getValue("servlet.dir.cache");
555
88ed97d08b97 still refactoring
robcast
parents: 552
diff changeset
196 String fp = getFilePath();
88ed97d08b97 still refactoring
robcast
parents: 552
diff changeset
197 fileDir = dirCache.getDirectory(fp);
541
f140d5ee8c0b new NumRange class
robcast
parents: 531
diff changeset
198 if (fileDir == null) {
f140d5ee8c0b new NumRange class
robcast
parents: 531
diff changeset
199 throw new FileOpException("Directory " + getFilePath() + " not found.");
500
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
200 }
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
201 }
541
f140d5ee8c0b new NumRange class
robcast
parents: 531
diff changeset
202 return fileDir;
500
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
203 }
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
204
593
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
205 /** Returns the ImageSet to load.
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
206 * @return
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
207 * @throws FileOpException
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
208 */
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
209 public ImageSet getImageSet() throws FileOpException {
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
210 if(imageSet==null){
541
f140d5ee8c0b new NumRange class
robcast
parents: 531
diff changeset
211 DocuDirCache dirCache = (DocuDirCache) dlConfig.getValue("servlet.dir.cache");
f140d5ee8c0b new NumRange class
robcast
parents: 531
diff changeset
212
593
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
213 imageSet = (ImageSet) dirCache.getFile(getFilePath(), getAsInt("pn"), FileClass.IMAGE);
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
214 if (imageSet == null) {
541
f140d5ee8c0b new NumRange class
robcast
parents: 531
diff changeset
215 throw new FileOpException("File " + getFilePath() + "("
f140d5ee8c0b new NumRange class
robcast
parents: 531
diff changeset
216 + getAsInt("pn") + ") not found.");
f140d5ee8c0b new NumRange class
robcast
parents: 531
diff changeset
217 }
f140d5ee8c0b new NumRange class
robcast
parents: 531
diff changeset
218 }
593
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
219 return imageSet;
541
f140d5ee8c0b new NumRange class
robcast
parents: 531
diff changeset
220 }
f140d5ee8c0b new NumRange class
robcast
parents: 531
diff changeset
221
593
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
222 /** Returns the file path name from the request.
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
223 * @return
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
224 */
500
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
225 public String getFilePath() {
541
f140d5ee8c0b new NumRange class
robcast
parents: 531
diff changeset
226 if(filePath == null){
500
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
227 String s = this.getAsString("request.path");
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
228 s += this.getAsString("fn");
541
f140d5ee8c0b new NumRange class
robcast
parents: 531
diff changeset
229 filePath = FileOps.normalName(s);
500
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
230 }
541
f140d5ee8c0b new NumRange class
robcast
parents: 531
diff changeset
231 return filePath;
500
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
232 }
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
233
593
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
234 public boolean isHiresOnly(){
547
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
235 return hasOption("clip") || hasOption("hires");
500
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
236 }
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
237
593
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
238 public boolean isLoresOnly(){
547
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
239 return hasOption("lores");
500
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
240 }
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
241
593
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
242 public boolean isScaleToFit() {
547
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
243 return !(hasOption("clip") || hasOption("osize") || hasOption("ascale"));
500
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
244 }
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
245
593
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
246 public boolean isAbsoluteScale(){
547
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
247 return hasOption("osize") || hasOption("ascale");
500
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
248 }
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
249
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
250
593
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
251 /** Returns the minimum size the source image should have for scaling.
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
252 * @return
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
253 * @throws IOException
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
254 */
547
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
255 public ImageSize getExpectedSourceSize() throws IOException {
500
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
256 if (expectedSourceSize == null){
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
257 expectedSourceSize = new ImageSize();
593
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
258 if (isScaleToFit()) {
500
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
259 // scale to fit -- calculate minimum source size
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
260 float scale = (1 / Math.min(getAsFloat("ww"), getAsFloat("wh"))) * getAsFloat("ws");
547
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
261 expectedSourceSize.setSize((int) (getDw() * scale),
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
262 (int) (getDh() * scale));
593
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
263 } else if (isAbsoluteScale() && hasOption("ascale")) {
500
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
264 // absolute scale -- apply scale to hires size
547
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
265 expectedSourceSize = getHiresSize().getScaled(getAsFloat("scale"));
500
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
266 } else {
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
267 // clip to fit -- source = destination size
547
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
268 expectedSourceSize.setSize((int) (getDw() * getAsFloat("ws")),
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
269 (int) (getDh() * getAsFloat("ws")));
500
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
270 }
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
271 }
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
272 return expectedSourceSize;
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
273 }
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
274
593
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
275 /** Returns the size of the highest resolution image.
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
276 * @return
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
277 * @throws IOException
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
278 */
547
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
279 public ImageSize getHiresSize() throws IOException {
500
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
280 logger.debug("get_hiresSize()");
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
281
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
282 ImageSize hiresSize = null;
593
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
283 ImageSet fileset = getImageSet();
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
284 if (isAbsoluteScale()) {
576
dad720e9b12b try: DocuDirent as interface, ImageFile inherits from ImageInput and implements DocuDirent
robcast
parents: 574
diff changeset
285 ImageInput hiresFile = fileset.getBiggest();
500
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
286 hiresSize = hiresFile.getSize();
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
287 }
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
288 return hiresSize;
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
289 }
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
290
547
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
291 /** Returns image scaling factor.
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
292 * Uses image size and user parameters.
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
293 * Modifies scaleXY, userImgArea.
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
294 * @return
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
295 * @throws IOException
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
296 * @throws ImageOpException
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
297 */
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
298 public float getScaleXY() throws IOException, ImageOpException {
500
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
299 //logger.debug("get_scaleXY()");
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
300 if(scaleXY == null){
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
301 // coordinates and scaling
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
302 float areaWidth;
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
303 float areaHeight;
547
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
304 float ws = getAsFloat("ws");
593
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
305 ImageSize imgSize = getInput().getSize();
500
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
306 // user window area in [0,1] coordinates
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
307 Rectangle2D relUserArea = new Rectangle2D.Float(getAsFloat("wx"), getAsFloat("wy"),
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
308 getAsFloat("ww"), getAsFloat("wh"));
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
309 // transform from relative [0,1] to image coordinates.
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
310 AffineTransform imgTrafo = AffineTransform.getScaleInstance(imgSize
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
311 .getWidth(), imgSize.getHeight());
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
312 // transform user coordinate area to image coordinate area
547
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
313 userImgArea = imgTrafo.createTransformedShape(
500
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
314 relUserArea).getBounds2D();
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
315
593
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
316 if (isScaleToFit()) {
547
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
317 // calculate scaling factors based on inner user area
500
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
318 areaWidth = (float) userImgArea.getWidth();
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
319 areaHeight = (float) userImgArea.getHeight();
547
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
320 float scaleX = getDw() / areaWidth * ws;
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
321 float scaleY = getDh() / areaHeight * ws;
500
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
322 scaleXY = (scaleX > scaleY) ? scaleY : scaleX;
593
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
323 } else if (isAbsoluteScale()) {
547
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
324 // absolute scaling factor
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
325 if (hasOption("osize")) {
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
326 // get original resolution from metadata
593
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
327 imageSet.checkMeta();
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
328 float origResX = imageSet.getResX();
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
329 float origResY = imageSet.getResY();
547
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
330 if ((origResX == 0) || (origResY == 0)) {
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
331 throw new ImageOpException("Missing image DPI information!");
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
332 }
771
4b686a0d44f7 fixed bug ignoring ddpi parameter
robcast
parents: 642
diff changeset
333 float ddpix = getAsFloat("ddpix");
4b686a0d44f7 fixed bug ignoring ddpi parameter
robcast
parents: 642
diff changeset
334 float ddpiy = getAsFloat("ddpiy");
4b686a0d44f7 fixed bug ignoring ddpi parameter
robcast
parents: 642
diff changeset
335 if (ddpix == 0 || ddpiy == 0) {
4b686a0d44f7 fixed bug ignoring ddpi parameter
robcast
parents: 642
diff changeset
336 float ddpi = getAsFloat("ddpi");
4b686a0d44f7 fixed bug ignoring ddpi parameter
robcast
parents: 642
diff changeset
337 if (ddpi == 0) {
4b686a0d44f7 fixed bug ignoring ddpi parameter
robcast
parents: 642
diff changeset
338 throw new ImageOpException("Missing display DPI information!");
4b686a0d44f7 fixed bug ignoring ddpi parameter
robcast
parents: 642
diff changeset
339 } else {
4b686a0d44f7 fixed bug ignoring ddpi parameter
robcast
parents: 642
diff changeset
340 ddpix = ddpi;
4b686a0d44f7 fixed bug ignoring ddpi parameter
robcast
parents: 642
diff changeset
341 ddpiy = ddpi;
4b686a0d44f7 fixed bug ignoring ddpi parameter
robcast
parents: 642
diff changeset
342 }
547
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
343 }
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
344 // calculate absolute scale factor
771
4b686a0d44f7 fixed bug ignoring ddpi parameter
robcast
parents: 642
diff changeset
345 float sx = ddpix / origResX;
4b686a0d44f7 fixed bug ignoring ddpi parameter
robcast
parents: 642
diff changeset
346 float sy = ddpiy / origResY;
547
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
347 // currently only same scale -- mean value
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
348 scaleXY = (sx + sy) / 2f;
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
349 } else {
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
350 scaleXY = getAsFloat("scale");
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
351 }
500
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
352 // we need to correct the factor if we use a pre-scaled image
547
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
353 ImageSize hiresSize = getHiresSize();
500
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
354 if (imgSize.getWidth() != hiresSize.getWidth()) {
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
355 scaleXY *= (float)hiresSize.getWidth() / (float)imgSize.getWidth();
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
356 }
547
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
357 areaWidth = getDw() / scaleXY * ws;
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
358 areaHeight = getDh() / scaleXY * ws;
500
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
359 // reset user area size
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
360 userImgArea.setRect(userImgArea.getX(), userImgArea.getY(),
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
361 areaWidth, areaHeight);
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
362 } else {
547
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
363 // crop to fit -- don't scale
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
364 areaWidth = getDw() * ws;
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
365 areaHeight = getDh() * ws;
500
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
366 // reset user area size
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
367 userImgArea.setRect(userImgArea.getX(), userImgArea.getY(),
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
368 areaWidth, areaHeight);
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
369 scaleXY = 1f;
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
370 }
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
371 }
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
372 return (float) scaleXY;
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
373 }
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
374
593
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
375 /** Returns the width of the destination image.
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
376 * Uses dh parameter and aspect ratio if dw parameter is empty.
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
377 * @return
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
378 * @throws IOException
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
379 */
547
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
380 public int getDw() throws IOException {
500
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
381 logger.debug("get_paramDW()");
547
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
382 if (paramDW == null) {
500
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
383
547
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
384 paramDW = getAsInt("dw");
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
385 paramDH = getAsInt("dh");
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
386
593
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
387 float imgAspect = getInput().getAspect();
500
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
388 if (paramDW == 0) {
547
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
389 // calculate dw
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
390 paramDW = Math.round(paramDH * imgAspect);
500
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
391 setValue("dw", paramDW);
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
392 } else if (paramDH == 0) {
547
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
393 // calculate dh
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
394 paramDH = Math.round(paramDW / imgAspect);
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
395 setValue("dh", paramDH);
500
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
396 }
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
397 }
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
398 return paramDW;
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
399 }
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
400
593
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
401 /** Returns the height of the destination image.
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
402 * Uses dw parameter and aspect ratio if dh parameter is empty.
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
403 * @return
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
404 * @throws IOException
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
405 */
547
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
406 public int getDh() throws IOException {
500
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
407 logger.debug("get_paramDH()");
547
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
408 if (paramDH == null) {
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
409
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
410 paramDW = getAsInt("dw");
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
411 paramDH = getAsInt("dh");
500
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
412
593
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
413 float imgAspect = getInput().getAspect();
500
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
414 if (paramDW == 0) {
547
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
415 // calculate dw
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
416 paramDW = Math.round(paramDH * imgAspect);
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
417 setValue("dw", paramDW);
500
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
418 } else if (paramDH == 0) {
547
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
419 // calculate dh
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
420 paramDH = Math.round(paramDW / imgAspect);
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
421 setValue("dh", paramDH);
500
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
422 }
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
423 }
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
424 return paramDH;
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
425 }
547
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
426
593
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
427 /** Returns image quality as an integer.
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
428 * @return
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
429 */
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
430 public int getScaleQual(){
500
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
431 logger.debug("get_scaleQual()");
593
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
432 int qual = dlConfig.getAsInt("default-quality");
547
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
433 if(hasOption("q0"))
500
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
434 qual = 0;
547
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
435 else if(hasOption("q1"))
500
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
436 qual = 1;
547
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
437 else if(hasOption("q2"))
500
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
438 qual = 2;
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
439 return qual;
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
440 }
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
441
829
a630d0303cce new servlet operation colop=grayscale.
robcast
parents: 819
diff changeset
442 public ColorOp getColOp() {
a630d0303cce new servlet operation colop=grayscale.
robcast
parents: 819
diff changeset
443 String op = getAsString("colop");
843
7718c6e832b0 enhance (cont, brgt) operation now with just one float.
robcast
parents: 829
diff changeset
444 if (op == null || op.length() == 0) {
7718c6e832b0 enhance (cont, brgt) operation now with just one float.
robcast
parents: 829
diff changeset
445 return null;
7718c6e832b0 enhance (cont, brgt) operation now with just one float.
robcast
parents: 829
diff changeset
446 }
829
a630d0303cce new servlet operation colop=grayscale.
robcast
parents: 819
diff changeset
447 try {
a630d0303cce new servlet operation colop=grayscale.
robcast
parents: 819
diff changeset
448 return ColorOp.valueOf(op.toUpperCase());
a630d0303cce new servlet operation colop=grayscale.
robcast
parents: 819
diff changeset
449 } catch (Exception e) {
a630d0303cce new servlet operation colop=grayscale.
robcast
parents: 819
diff changeset
450 logger.error("Invalid color op: " + op);
a630d0303cce new servlet operation colop=grayscale.
robcast
parents: 819
diff changeset
451 }
a630d0303cce new servlet operation colop=grayscale.
robcast
parents: 819
diff changeset
452 return null;
a630d0303cce new servlet operation colop=grayscale.
robcast
parents: 819
diff changeset
453 }
500
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
454
593
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
455 /**
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
456 * Returns the area of the source image that will be transformed into the
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
457 * destination image.
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
458 *
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
459 * @return
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
460 * @throws IOException
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
461 * @throws ImageOpException
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
462 */
547
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
463 public Rectangle2D getUserImgArea() throws IOException, ImageOpException{
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
464 if(userImgArea == null) {
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
465 // getScaleXY sets userImgArea
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
466 getScaleXY();
500
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
467 }
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
468 return userImgArea;
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
469 }
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
470
593
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
471 /** Returns the maximal area of the source image that will be used.
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
472 * @return
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
473 * @throws IOException
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
474 * @throws ImageOpException
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
475 */
547
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
476 public Rectangle2D getOuterUserImgArea() throws IOException, ImageOpException {
500
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
477 if(outerUserImgArea == null){
547
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
478 outerUserImgArea = getUserImgArea();
500
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
479
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
480 // image size in pixels
593
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
481 ImageSize imgSize = getInput().getSize();
547
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
482 Rectangle2D imgBounds = new Rectangle2D.Float(0, 0, imgSize.getWidth(),
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
483 imgSize.getHeight());
500
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
484
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
485 // clip area at the image border
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
486 outerUserImgArea = outerUserImgArea.createIntersection(imgBounds);
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
487
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
488 // check image parameters sanity
547
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
489 scaleXY = getScaleXY();
500
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
490 logger.debug("outerUserImgArea.getWidth()=" + outerUserImgArea.getWidth());
547
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
491 logger.debug("get_scaleXY() * outerUserImgArea.getWidth() = " + (scaleXY * outerUserImgArea.getWidth()));
500
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
492
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
493 if ((outerUserImgArea.getWidth() < 1)
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
494 || (outerUserImgArea.getHeight() < 1)
547
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
495 || (scaleXY * outerUserImgArea.getWidth() < 2)
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
496 || (scaleXY * outerUserImgArea.getHeight() < 2)) {
500
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
497 logger.error("ERROR: invalid scale parameter set!");
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
498 throw new ImageOpException("Invalid scale parameter set!");
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
499 }
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
500 }
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
501 return outerUserImgArea;
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
502 }
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
503
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
504
547
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
505 public float[] getRGBM(){
502
157d4c7d2343 readded support for direct sending of image files
cmielack
parents: 500
diff changeset
506 float[] paramRGBM = null;//{0f,0f,0f};
547
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
507 Parameter p = params.get("rgbm");
500
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
508 if (p.hasValue() && (!p.getAsString().equals("0/0/0"))) {
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
509 return p.parseAsFloatArray("/");
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
510 }
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
511 return paramRGBM;
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
512 }
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
513
547
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
514 public float[] getRGBA(){
502
157d4c7d2343 readded support for direct sending of image files
cmielack
parents: 500
diff changeset
515 float[] paramRGBA = null;//{0f,0f,0f};
547
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
516 Parameter p = params.get("rgba");
500
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
517 if (p.hasValue() && (!p.getAsString().equals("0/0/0"))) {
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
518 paramRGBA = p.parseAsFloatArray("/");
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
519 }
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
520 return paramRGBA;
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
521 }
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
522
547
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
523 /** Has send-as-file been requested?
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
524 * @return
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
525 */
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
526 public boolean getSendAsFile(){
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
527 return hasOption("file")
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
528 || hasOption("rawfile");
500
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
529 }
502
157d4c7d2343 readded support for direct sending of image files
cmielack
parents: 500
diff changeset
530
819
a23c4c15a6a8 clean up possible resource leaks. better behaviour with unknown image types.
robcast
parents: 774
diff changeset
531 /**
a23c4c15a6a8 clean up possible resource leaks. better behaviour with unknown image types.
robcast
parents: 774
diff changeset
532 * Returns if the image can be sent without processing. Takes image type and
a23c4c15a6a8 clean up possible resource leaks. better behaviour with unknown image types.
robcast
parents: 774
diff changeset
533 * additional image operations into account. Does not check requested size
a23c4c15a6a8 clean up possible resource leaks. better behaviour with unknown image types.
robcast
parents: 774
diff changeset
534 * transformation.
a23c4c15a6a8 clean up possible resource leaks. better behaviour with unknown image types.
robcast
parents: 774
diff changeset
535 *
a23c4c15a6a8 clean up possible resource leaks. better behaviour with unknown image types.
robcast
parents: 774
diff changeset
536 * @return
a23c4c15a6a8 clean up possible resource leaks. better behaviour with unknown image types.
robcast
parents: 774
diff changeset
537 * @throws IOException
a23c4c15a6a8 clean up possible resource leaks. better behaviour with unknown image types.
robcast
parents: 774
diff changeset
538 */
a23c4c15a6a8 clean up possible resource leaks. better behaviour with unknown image types.
robcast
parents: 774
diff changeset
539 public boolean isImageSendable() throws IOException {
a23c4c15a6a8 clean up possible resource leaks. better behaviour with unknown image types.
robcast
parents: 774
diff changeset
540 if (imageSendable == null) {
a23c4c15a6a8 clean up possible resource leaks. better behaviour with unknown image types.
robcast
parents: 774
diff changeset
541 String mimeType = getMimeType();
a23c4c15a6a8 clean up possible resource leaks. better behaviour with unknown image types.
robcast
parents: 774
diff changeset
542 imageSendable = (mimeType != null
a23c4c15a6a8 clean up possible resource leaks. better behaviour with unknown image types.
robcast
parents: 774
diff changeset
543 && (mimeType.equals("image/jpeg") || mimeType.equals("image/png")
a23c4c15a6a8 clean up possible resource leaks. better behaviour with unknown image types.
robcast
parents: 774
diff changeset
544 || mimeType.equals("image/gif"))
a23c4c15a6a8 clean up possible resource leaks. better behaviour with unknown image types.
robcast
parents: 774
diff changeset
545 && !(hasOption("hmir")
a23c4c15a6a8 clean up possible resource leaks. better behaviour with unknown image types.
robcast
parents: 774
diff changeset
546 || hasOption("vmir") || (getAsFloat("rot") != 0.0)
a23c4c15a6a8 clean up possible resource leaks. better behaviour with unknown image types.
robcast
parents: 774
diff changeset
547 || (getRGBM() != null) || (getRGBA() != null)
a23c4c15a6a8 clean up possible resource leaks. better behaviour with unknown image types.
robcast
parents: 774
diff changeset
548 || (getAsFloat("cont") != 0.0) || (getAsFloat("brgt") != 0.0)));
a23c4c15a6a8 clean up possible resource leaks. better behaviour with unknown image types.
robcast
parents: 774
diff changeset
549 }
a23c4c15a6a8 clean up possible resource leaks. better behaviour with unknown image types.
robcast
parents: 774
diff changeset
550 return imageSendable;
a23c4c15a6a8 clean up possible resource leaks. better behaviour with unknown image types.
robcast
parents: 774
diff changeset
551 }
502
157d4c7d2343 readded support for direct sending of image files
cmielack
parents: 500
diff changeset
552
157d4c7d2343 readded support for direct sending of image files
cmielack
parents: 500
diff changeset
553
593
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
554 /**
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
555 * Returns if any transformation of the source image (image manipulation or
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
556 * format conversion) is required.
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
557 *
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
558 * @return
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
559 * @throws IOException
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
560 */
547
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
561 public boolean isTransformRequired() throws IOException {
593
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
562 ImageSize is = getInput().getSize();
547
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
563 ImageSize ess = getExpectedSourceSize();
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
564 // nt = no transform required
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
565 boolean nt = isImageSendable() && (
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
566 // lores: send if smaller
593
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
567 (isLoresOnly() && is.isSmallerThan(ess))
547
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
568 // else send if it fits
593
7768ea8f59cf more work on stream input -- cleaning up references to files
robcast
parents: 589
diff changeset
569 || (!(isLoresOnly() || isHiresOnly()) && is.fitsIn(ess)));
547
e1094c5ec032 more cleanup and refactoring
robcast
parents: 542
diff changeset
570 return ! nt;
502
157d4c7d2343 readded support for direct sending of image files
cmielack
parents: 500
diff changeset
571 }
906
28d007673346 really works with streams now.
robcast
parents: 903
diff changeset
572
28d007673346 really works with streams now.
robcast
parents: 903
diff changeset
573
28d007673346 really works with streams now.
robcast
parents: 903
diff changeset
574 /**
28d007673346 really works with streams now.
robcast
parents: 903
diff changeset
575 * @return the docuImage
28d007673346 really works with streams now.
robcast
parents: 903
diff changeset
576 */
28d007673346 really works with streams now.
robcast
parents: 903
diff changeset
577 public DocuImage getDocuImage() {
28d007673346 really works with streams now.
robcast
parents: 903
diff changeset
578 return docuImage;
28d007673346 really works with streams now.
robcast
parents: 903
diff changeset
579 }
28d007673346 really works with streams now.
robcast
parents: 903
diff changeset
580
28d007673346 really works with streams now.
robcast
parents: 903
diff changeset
581
28d007673346 really works with streams now.
robcast
parents: 903
diff changeset
582 /**
28d007673346 really works with streams now.
robcast
parents: 903
diff changeset
583 * @param docuImage the docuImage to set
28d007673346 really works with streams now.
robcast
parents: 903
diff changeset
584 */
28d007673346 really works with streams now.
robcast
parents: 903
diff changeset
585 public void setDocuImage(DocuImage docuImage) {
28d007673346 really works with streams now.
robcast
parents: 903
diff changeset
586 this.docuImage = docuImage;
28d007673346 really works with streams now.
robcast
parents: 903
diff changeset
587 }
500
b2325b33b77b completely restructured the scaler
cmielack
parents:
diff changeset
588 }