Mercurial > hg > digilib-old
annotate common/src/main/java/digilib/image/ImageWorker.java @ 903:7779b37d1d05
refactored into maven modules per servlet type.
can build servlet-api 2.3 and 3.0 via profile now!
| author | robcast |
|---|---|
| date | Tue, 26 Apr 2011 20:24:31 +0200 |
| parents | servlet/src/main/java/digilib/image/ImageWorker.java@ba1eb2d821a2 |
| children | 28d007673346 |
| rev | line source |
|---|---|
|
543
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
1 /** Worker (Callable) that renders an image. |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
2 * |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
3 */ |
| 557 | 4 package digilib.image; |
|
543
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
5 |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
6 import java.awt.Rectangle; |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
7 import java.io.IOException; |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
8 import java.util.concurrent.Callable; |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
9 |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
10 import org.apache.log4j.Logger; |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
11 |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
12 import digilib.io.FileOpException; |
| 557 | 13 import digilib.servlet.DigilibConfiguration; |
|
543
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
14 |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
15 /** Worker that renders an image. |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
16 * |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
17 * @author casties |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
18 * |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
19 */ |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
20 public class ImageWorker implements Callable<DocuImage> { |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
21 |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
22 protected static Logger logger = Logger.getLogger(ImageWorker.class); |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
23 private DigilibConfiguration dlConfig; |
| 547 | 24 private ImageJobDescription jobinfo; |
|
543
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
25 |
| 547 | 26 public ImageWorker(DigilibConfiguration dlConfig, ImageJobDescription jobinfo) { |
|
543
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
27 super(); |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
28 this.dlConfig = dlConfig; |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
29 this.jobinfo = jobinfo; |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
30 } |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
31 |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
32 /** |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
33 * render and return the image |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
34 */ |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
35 public DocuImage call() throws FileOpException, IOException, ImageOpException { |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
36 |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
37 logger.debug("image worker starting"); |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
38 long startTime = System.currentTimeMillis(); |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
39 |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
40 /* crop and scale image */ |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
41 |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
42 // new DocuImage instance |
| 564 | 43 DocuImage docuImage = DigilibConfiguration.getDocuImageInstance(); |
|
543
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
44 if (docuImage == null) { |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
45 throw new ImageOpException("Unable to load DocuImage class!"); |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
46 } |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
47 |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
48 // set interpolation quality |
| 565 | 49 docuImage.setQuality(jobinfo.getScaleQual()); |
|
543
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
50 |
| 547 | 51 Rectangle loadRect = jobinfo.getOuterUserImgArea().getBounds(); |
| 52 float scaleXY = jobinfo.getScaleXY(); | |
|
543
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
53 |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
54 // use subimage loading if possible |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
55 if (docuImage.isSubimageSupported()) { |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
56 logger.debug("Subimage: scale " + scaleXY + " = " + (1 / scaleXY)); |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
57 float subf = 1f; |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
58 float subsamp = 1f; |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
59 if (scaleXY < 1) { |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
60 subf = 1 / scaleXY; |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
61 // for higher quality reduce subsample factor by minSubsample |
| 565 | 62 if (jobinfo.getScaleQual() > 0) { |
|
543
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
63 subsamp = (float) Math.max(Math.floor(subf / dlConfig.getAsFloat("subsample-minimum")), 1d); |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
64 } else { |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
65 subsamp = (float) Math.floor(subf); |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
66 } |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
67 scaleXY = subsamp / subf; |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
68 logger.debug("Using subsampling: " + subsamp + " rest " |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
69 + scaleXY); |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
70 } |
|
593
7768ea8f59cf
more work on stream input -- cleaning up references to files
robcast
parents:
589
diff
changeset
|
71 docuImage.loadSubimage(jobinfo.getInput(), loadRect, (int) subsamp); |
| 570 | 72 logger.debug("SUBSAMP: " + subsamp + " -> " + docuImage.getSize()); |
|
543
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
73 docuImage.scale(scaleXY, scaleXY); |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
74 } else { |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
75 // else load and crop the whole file |
|
593
7768ea8f59cf
more work on stream input -- cleaning up references to files
robcast
parents:
589
diff
changeset
|
76 docuImage.loadImage(jobinfo.getInput()); |
|
543
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
77 docuImage.crop((int) loadRect.getX(), (int) loadRect.getY(), |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
78 (int) loadRect.getWidth(), (int) loadRect.getHeight()); |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
79 docuImage.scale(scaleXY, scaleXY); |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
80 } |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
81 |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
82 // mirror image |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
83 // operation mode: "hmir": mirror horizontally, "vmir": mirror |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
84 // vertically |
| 547 | 85 if (jobinfo.hasOption("hmir")) { |
|
543
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
86 docuImage.mirror(0); |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
87 } |
| 547 | 88 if (jobinfo.hasOption("vmir")) { |
|
543
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
89 docuImage.mirror(90); |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
90 } |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
91 |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
92 // rotate image |
| 547 | 93 if (jobinfo.getAsFloat("rot") != 0d) { |
| 94 docuImage.rotate(jobinfo.getAsFloat("rot")); | |
| 95 /* if (jobinfo.get_wholeRotArea()) { | |
|
543
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
96 // crop to the inner bounding box |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
97 float xcrop = (float) (docuImage.getWidth() - jobinfo.get_innerUserImgArea().getWidth() |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
98 * scaleXY); |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
99 float ycrop = (float) (docuImage.getHeight() - jobinfo.get_innerUserImgArea().getHeight() |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
100 * scaleXY); |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
101 if ((xcrop > 0) || (ycrop > 0)) { |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
102 // only crop smaller |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
103 xcrop = (xcrop > 0) ? xcrop : 0; |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
104 ycrop = (ycrop > 0) ? ycrop : 0; |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
105 // crop image |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
106 docuImage.crop((int) (xcrop / 2), (int) (ycrop / 2), |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
107 (int) (docuImage.getWidth() - xcrop), |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
108 (int) (docuImage.getHeight() - ycrop)); |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
109 } |
| 547 | 110 } */ |
|
543
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
111 |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
112 } |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
113 |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
114 // color modification |
| 547 | 115 float[] paramRGBM = jobinfo.getRGBM(); |
| 116 float[] paramRGBA = jobinfo.getRGBA(); | |
|
543
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
117 if ((paramRGBM != null) || (paramRGBA != null)) { |
| 547 | 118 // make sure we actually have two arrays |
|
543
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
119 if (paramRGBM == null) { |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
120 paramRGBM = new float[3]; |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
121 } |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
122 if (paramRGBA == null) { |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
123 paramRGBA = new float[3]; |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
124 } |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
125 // calculate "contrast" values (c=2^x) |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
126 float[] mult = new float[3]; |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
127 for (int i = 0; i < 3; i++) { |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
128 mult[i] = (float) Math.pow(2, (float) paramRGBM[i]); |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
129 } |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
130 docuImage.enhanceRGB(mult, paramRGBA); |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
131 } |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
132 |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
133 // contrast and brightness enhancement |
| 547 | 134 float paramCONT = jobinfo.getAsFloat("cont"); |
| 135 float paramBRGT = jobinfo.getAsFloat("brgt"); | |
|
543
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
136 if ((paramCONT != 0f) || (paramBRGT != 0f)) { |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
137 float mult = (float) Math.pow(2, paramCONT); |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
138 docuImage.enhance(mult, paramBRGT); |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
139 } |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
140 |
| 829 | 141 // color operation |
| 142 DocuImage.ColorOp colop = jobinfo.getColOp(); | |
| 143 if (colop != null) { | |
| 144 docuImage.colorOp(colop); | |
| 145 } | |
| 146 | |
|
543
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
147 logger.debug("rendered in " + (System.currentTimeMillis() - startTime) + "ms"); |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
148 |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
149 return docuImage; |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
150 } |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
151 |
|
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
152 } |
