Mercurial > hg > digilib-old
annotate servlet/src/digilib/servlet/ImageWorker.java @ 543:919e008ab1fb digilibPDF
more steps towards more standard java.util.concurrent design
author | robcast |
---|---|
date | Thu, 14 Oct 2010 14:24:33 +0200 |
parents | |
children | e1094c5ec032 |
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 */ |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
4 package digilib.servlet; |
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.image.DocuImage; |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
13 import digilib.image.ImageOpException; |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
14 import digilib.io.FileOpException; |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
15 |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
16 /** Worker that renders an image. |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
17 * |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
18 * @author casties |
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 */ |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
21 public class ImageWorker implements Callable<DocuImage> { |
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 |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
24 protected static Logger logger = Logger.getLogger(ImageWorker.class); |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
25 private DigilibConfiguration dlConfig; |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
26 private ImageJobInformation jobinfo; |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
27 |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
28 public ImageWorker(DigilibConfiguration dlConfig, ImageJobInformation jobinfo) { |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
29 super(); |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
30 this.dlConfig = dlConfig; |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
31 this.jobinfo = jobinfo; |
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 /** |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
35 * render and return the image |
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 @Override |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
38 public DocuImage call() throws FileOpException, IOException, ImageOpException { |
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 logger.debug("image worker starting"); |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
41 long startTime = System.currentTimeMillis(); |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
42 |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
43 /* crop and scale image */ |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
44 |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
45 // new DocuImage instance |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
46 DocuImage docuImage = dlConfig.getDocuImageInstance(); |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
47 if (docuImage == null) { |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
48 throw new ImageOpException("Unable to load DocuImage class!"); |
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 |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
51 // set interpolation quality |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
52 docuImage.setQuality(jobinfo.get_scaleQual()); |
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 Rectangle loadRect = jobinfo.get_outerUserImgArea().getBounds(); |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
55 float scaleXY = jobinfo.get_scaleXY(); |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
56 |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
57 // use subimage loading if possible |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
58 if (docuImage.isSubimageSupported()) { |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
59 logger.debug("Subimage: scale " + scaleXY + " = " + (1 / scaleXY)); |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
60 float subf = 1f; |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
61 float subsamp = 1f; |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
62 if (scaleXY < 1) { |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
63 subf = 1 / scaleXY; |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
64 // for higher quality reduce subsample factor by minSubsample |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
65 if (jobinfo.get_scaleQual() > 0) { |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
66 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
|
67 } else { |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
68 subsamp = (float) Math.floor(subf); |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
69 } |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
70 scaleXY = subsamp / subf; |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
71 logger.debug("Using subsampling: " + subsamp + " rest " |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
72 + scaleXY); |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
73 } |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
74 |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
75 docuImage.loadSubimage(jobinfo.get_fileToLoad(), loadRect, (int) subsamp); |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
76 |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
77 logger.debug("SUBSAMP: " + subsamp + " -> " + docuImage.getWidth() |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
78 + "x" + docuImage.getHeight()); |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
79 |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
80 docuImage.scale(scaleXY, scaleXY); |
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 } else { |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
83 // else load and crop the whole file |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
84 docuImage.loadImage(jobinfo.get_fileToLoad()); |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
85 docuImage.crop((int) loadRect.getX(), (int) loadRect.getY(), |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
86 (int) loadRect.getWidth(), (int) loadRect.getHeight()); |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
87 |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
88 docuImage.scale(scaleXY, scaleXY); |
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 |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
91 // mirror image |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
92 // operation mode: "hmir": mirror horizontally, "vmir": mirror |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
93 // vertically |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
94 if (jobinfo.get_hmir()) { |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
95 docuImage.mirror(0); |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
96 } |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
97 if (jobinfo.get_vmir()) { |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
98 docuImage.mirror(90); |
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 |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
101 // rotate image |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
102 if (jobinfo.getRot() != 0d) { |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
103 docuImage.rotate(jobinfo.getRot()); |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
104 if (jobinfo.get_wholeRotArea()) { |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
105 // crop to the inner bounding box |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
106 float xcrop = (float) (docuImage.getWidth() - jobinfo.get_innerUserImgArea().getWidth() |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
107 * scaleXY); |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
108 float ycrop = (float) (docuImage.getHeight() - jobinfo.get_innerUserImgArea().getHeight() |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
109 * scaleXY); |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
110 if ((xcrop > 0) || (ycrop > 0)) { |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
111 // only crop smaller |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
112 xcrop = (xcrop > 0) ? xcrop : 0; |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
113 ycrop = (ycrop > 0) ? ycrop : 0; |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
114 // crop image |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
115 docuImage.crop((int) (xcrop / 2), (int) (ycrop / 2), |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
116 (int) (docuImage.getWidth() - xcrop), |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
117 (int) (docuImage.getHeight() - ycrop)); |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
118 } |
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 |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
123 // color modification |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
124 float[] paramRGBM = jobinfo.get_paramRGBM(); |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
125 float[] paramRGBA = jobinfo.get_paramRGBA(); |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
126 if ((paramRGBM != null) || (paramRGBA != null)) { |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
127 // make shure we actually have two arrays |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
128 if (paramRGBM == null) { |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
129 paramRGBM = new float[3]; |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
130 } |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
131 if (paramRGBA == null) { |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
132 paramRGBA = new float[3]; |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
133 } |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
134 // calculate "contrast" values (c=2^x) |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
135 float[] mult = new float[3]; |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
136 for (int i = 0; i < 3; i++) { |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
137 mult[i] = (float) Math.pow(2, (float) paramRGBM[i]); |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
138 } |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
139 docuImage.enhanceRGB(mult, paramRGBA); |
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 |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
142 // contrast and brightness enhancement |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
143 float paramCONT = jobinfo.getCont(); |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
144 float paramBRGT = jobinfo.getBrgt(); |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
145 if ((paramCONT != 0f) || (paramBRGT != 0f)) { |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
146 float mult = (float) Math.pow(2, paramCONT); |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
147 docuImage.enhance(mult, paramBRGT); |
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 |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
150 logger.debug("rendered in " + (System.currentTimeMillis() - startTime) + "ms"); |
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 return docuImage; |
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 |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
diff
changeset
|
155 } |