annotate servlet/src/digilib/image/ImageWorker.java @ 568:34701340922e stream

more starting stream support
author robcast
date Tue, 21 Dec 2010 12:16:33 +0100
parents 8beefd1142b2
children fd2ef7e46119
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
0885f5ca5b24 more refactoring and rearranging
robcast
parents: 547
diff changeset
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
0885f5ca5b24 more refactoring and rearranging
robcast
parents: 547
diff changeset
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
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
23 protected static Logger logger = Logger.getLogger(ImageWorker.class);
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
24 private DigilibConfiguration dlConfig;
547
e1094c5ec032 more cleanup and refactoring
robcast
parents: 543
diff changeset
25 private ImageJobDescription jobinfo;
543
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
26
547
e1094c5ec032 more cleanup and refactoring
robcast
parents: 543
diff changeset
27 public ImageWorker(DigilibConfiguration dlConfig, ImageJobDescription jobinfo) {
543
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
28 super();
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
29 this.dlConfig = dlConfig;
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
30 this.jobinfo = jobinfo;
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 /**
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
34 * render and return the image
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
35 */
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
36 @Override
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
37 public DocuImage call() throws FileOpException, IOException, ImageOpException {
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
38
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
39 logger.debug("image worker starting");
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
40 long startTime = System.currentTimeMillis();
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 /* crop and scale image */
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
43
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
44 // new DocuImage instance
564
4c51d71aef13 more reshuffling of classes
robcast
parents: 557
diff changeset
45 DocuImage docuImage = DigilibConfiguration.getDocuImageInstance();
543
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
46 if (docuImage == null) {
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
47 throw new ImageOpException("Unable to load DocuImage class!");
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
48 }
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
49
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
50 // set interpolation quality
565
8beefd1142b2 more cleanup
robcast
parents: 564
diff changeset
51 docuImage.setQuality(jobinfo.getScaleQual());
543
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
52
547
e1094c5ec032 more cleanup and refactoring
robcast
parents: 543
diff changeset
53 Rectangle loadRect = jobinfo.getOuterUserImgArea().getBounds();
e1094c5ec032 more cleanup and refactoring
robcast
parents: 543
diff changeset
54 float scaleXY = jobinfo.getScaleXY();
543
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
55
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
56 // use subimage loading if possible
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
57 if (docuImage.isSubimageSupported()) {
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
58 logger.debug("Subimage: scale " + scaleXY + " = " + (1 / scaleXY));
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
59 float subf = 1f;
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
60 float subsamp = 1f;
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
61 if (scaleXY < 1) {
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
62 subf = 1 / scaleXY;
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
63 // for higher quality reduce subsample factor by minSubsample
565
8beefd1142b2 more cleanup
robcast
parents: 564
diff changeset
64 if (jobinfo.getScaleQual() > 0) {
543
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
65 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
66 } else {
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
67 subsamp = (float) Math.floor(subf);
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
68 }
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
69 scaleXY = subsamp / subf;
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
70 logger.debug("Using subsampling: " + subsamp + " rest "
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
71 + scaleXY);
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
72 }
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
73
547
e1094c5ec032 more cleanup and refactoring
robcast
parents: 543
diff changeset
74 docuImage.loadSubimage(jobinfo.getFileToLoad(), loadRect, (int) subsamp);
543
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
75
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
76 logger.debug("SUBSAMP: " + subsamp + " -> " + docuImage.getWidth()
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
77 + "x" + docuImage.getHeight());
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
78
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 } else {
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
82 // else load and crop the whole file
547
e1094c5ec032 more cleanup and refactoring
robcast
parents: 543
diff changeset
83 docuImage.loadImage(jobinfo.getFileToLoad());
543
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
84 docuImage.crop((int) loadRect.getX(), (int) loadRect.getY(),
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
85 (int) loadRect.getWidth(), (int) loadRect.getHeight());
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
86
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
87 docuImage.scale(scaleXY, scaleXY);
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
88 }
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
89
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
90 // mirror image
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
91 // operation mode: "hmir": mirror horizontally, "vmir": mirror
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
92 // vertically
547
e1094c5ec032 more cleanup and refactoring
robcast
parents: 543
diff changeset
93 if (jobinfo.hasOption("hmir")) {
543
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
94 docuImage.mirror(0);
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
95 }
547
e1094c5ec032 more cleanup and refactoring
robcast
parents: 543
diff changeset
96 if (jobinfo.hasOption("vmir")) {
543
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
97 docuImage.mirror(90);
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
98 }
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
99
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
100 // rotate image
547
e1094c5ec032 more cleanup and refactoring
robcast
parents: 543
diff changeset
101 if (jobinfo.getAsFloat("rot") != 0d) {
e1094c5ec032 more cleanup and refactoring
robcast
parents: 543
diff changeset
102 docuImage.rotate(jobinfo.getAsFloat("rot"));
e1094c5ec032 more cleanup and refactoring
robcast
parents: 543
diff changeset
103 /* if (jobinfo.get_wholeRotArea()) {
543
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
104 // crop to the inner bounding box
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
105 float xcrop = (float) (docuImage.getWidth() - jobinfo.get_innerUserImgArea().getWidth()
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
106 * scaleXY);
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
107 float ycrop = (float) (docuImage.getHeight() - jobinfo.get_innerUserImgArea().getHeight()
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
108 * scaleXY);
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
109 if ((xcrop > 0) || (ycrop > 0)) {
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
110 // only crop smaller
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
111 xcrop = (xcrop > 0) ? xcrop : 0;
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
112 ycrop = (ycrop > 0) ? ycrop : 0;
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
113 // crop image
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
114 docuImage.crop((int) (xcrop / 2), (int) (ycrop / 2),
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
115 (int) (docuImage.getWidth() - xcrop),
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
116 (int) (docuImage.getHeight() - ycrop));
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
117 }
547
e1094c5ec032 more cleanup and refactoring
robcast
parents: 543
diff changeset
118 } */
543
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
119
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
120 }
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 // color modification
547
e1094c5ec032 more cleanup and refactoring
robcast
parents: 543
diff changeset
123 float[] paramRGBM = jobinfo.getRGBM();
e1094c5ec032 more cleanup and refactoring
robcast
parents: 543
diff changeset
124 float[] paramRGBA = jobinfo.getRGBA();
543
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
125 if ((paramRGBM != null) || (paramRGBA != null)) {
547
e1094c5ec032 more cleanup and refactoring
robcast
parents: 543
diff changeset
126 // make sure we actually have two arrays
543
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
127 if (paramRGBM == null) {
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
128 paramRGBM = new float[3];
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 if (paramRGBA == null) {
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
131 paramRGBA = new float[3];
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 // calculate "contrast" values (c=2^x)
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
134 float[] mult = new float[3];
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
135 for (int i = 0; i < 3; i++) {
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
136 mult[i] = (float) Math.pow(2, (float) paramRGBM[i]);
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
137 }
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
138 docuImage.enhanceRGB(mult, paramRGBA);
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
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
141 // contrast and brightness enhancement
547
e1094c5ec032 more cleanup and refactoring
robcast
parents: 543
diff changeset
142 float paramCONT = jobinfo.getAsFloat("cont");
e1094c5ec032 more cleanup and refactoring
robcast
parents: 543
diff changeset
143 float paramBRGT = jobinfo.getAsFloat("brgt");
543
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
144 if ((paramCONT != 0f) || (paramBRGT != 0f)) {
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
145 float mult = (float) Math.pow(2, paramCONT);
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
146 docuImage.enhance(mult, paramBRGT);
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
147 }
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 logger.debug("rendered in " + (System.currentTimeMillis() - startTime) + "ms");
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 return docuImage;
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
152 }
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
153
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents:
diff changeset
154 }