Mercurial > hg > digilib-old
comparison servlet/src/digilib/image/ImageLoaderDocuImage.java @ 590:69bc69381ac4 stream
more work on stream input and more cleanup
author | robcast |
---|---|
date | Thu, 06 Jan 2011 20:42:29 +0100 |
parents | 73e041c710d3 |
children | 2b58d2783ef0 |
comparison
equal
deleted
inserted
replaced
589:73e041c710d3 | 590:69bc69381ac4 |
---|---|
27 import java.awt.image.AffineTransformOp; | 27 import java.awt.image.AffineTransformOp; |
28 import java.awt.image.BufferedImage; | 28 import java.awt.image.BufferedImage; |
29 import java.awt.image.ConvolveOp; | 29 import java.awt.image.ConvolveOp; |
30 import java.awt.image.Kernel; | 30 import java.awt.image.Kernel; |
31 import java.awt.image.RescaleOp; | 31 import java.awt.image.RescaleOp; |
32 import java.io.File; | |
33 import java.io.IOException; | 32 import java.io.IOException; |
34 import java.io.OutputStream; | 33 import java.io.OutputStream; |
35 import java.io.RandomAccessFile; | 34 import java.io.RandomAccessFile; |
36 import java.util.Arrays; | 35 import java.util.Arrays; |
37 import java.util.Iterator; | 36 import java.util.Iterator; |
51 import digilib.io.FileOps; | 50 import digilib.io.FileOps; |
52 import digilib.io.ImageInput; | 51 import digilib.io.ImageInput; |
53 | 52 |
54 /** Implementation of DocuImage using the ImageLoader API of Java 1.4 and Java2D. */ | 53 /** Implementation of DocuImage using the ImageLoader API of Java 1.4 and Java2D. */ |
55 public class ImageLoaderDocuImage extends ImageInfoDocuImage { | 54 public class ImageLoaderDocuImage extends ImageInfoDocuImage { |
56 | 55 |
57 /** image object */ | 56 /** image object */ |
58 protected BufferedImage img; | 57 protected BufferedImage img; |
59 | 58 |
60 /** interpolation type */ | 59 /** interpolation type */ |
61 protected RenderingHints renderHint; | 60 protected RenderingHints renderHint; |
62 | 61 |
63 /** ImageIO image reader */ | 62 /** ImageIO image reader */ |
64 protected ImageReader reader; | 63 protected ImageReader reader; |
65 | 64 |
66 /** File that was read */ | 65 protected static Kernel[] convolutionKernels = { |
67 protected File imgFile; | 66 null, |
68 | 67 new Kernel(1, 1, new float[] {1f}), |
68 new Kernel(2, 2, new float[] {0.25f, 0.25f, 0.25f, 0.25f}), | |
69 new Kernel(3, 3, new float[] {1f/9f, 1f/9f, 1f/9f, 1f/9f, 1f/9f, 1f/9f, 1f/9f, 1f/9f, 1f/9f}) | |
70 }; | |
71 | |
72 | |
69 /* loadSubimage is supported. */ | 73 /* loadSubimage is supported. */ |
70 public boolean isSubimageSupported() { | 74 public boolean isSubimageSupported() { |
71 return true; | 75 return true; |
72 } | 76 } |
73 | 77 |
126 } | 130 } |
127 logger.debug("identifying (ImageIO) " + input); | 131 logger.debug("identifying (ImageIO) " + input); |
128 /* | 132 /* |
129 * try ImageReader | 133 * try ImageReader |
130 */ | 134 */ |
131 reader = getReader(input); | 135 try { |
136 reader = getReader(input); | |
137 } catch (FileOpException e) { | |
138 // maybe just our class doesn't know what to do | |
139 return null; | |
140 } | |
132 // set size | 141 // set size |
133 ImageSize d = new ImageSize(reader.getWidth(0), reader.getHeight(0)); | 142 ImageSize d = new ImageSize(reader.getWidth(0), reader.getHeight(0)); |
134 input.setSize(d); | 143 input.setSize(d); |
135 // set mime type | 144 // set mime type |
136 if (input.getMimetype() == null) { | 145 if (input.getMimetype() == null) { |
172 if (this.input == input) { | 181 if (this.input == input) { |
173 // it was the same input | 182 // it was the same input |
174 logger.debug("reusing Reader"); | 183 logger.debug("reusing Reader"); |
175 return reader; | 184 return reader; |
176 } | 185 } |
177 // clean up old reader | 186 // clean up old reader (this shouldn't really happen) |
178 logger.debug("cleaning Reader!"); | 187 logger.debug("cleaning Reader!"); |
179 dispose(); | 188 dispose(); |
180 } | 189 } |
181 this.input = input; | 190 this.input = input; |
182 ImageInputStream istream = null; | 191 ImageInputStream istream = null; |
215 /* Load an image file into the Object. */ | 224 /* Load an image file into the Object. */ |
216 public void loadSubimage(ImageInput ii, Rectangle region, int prescale) | 225 public void loadSubimage(ImageInput ii, Rectangle region, int prescale) |
217 throws FileOpException { | 226 throws FileOpException { |
218 logger.debug("loadSubimage"); | 227 logger.debug("loadSubimage"); |
219 try { | 228 try { |
220 if ((reader == null) || (imgFile != ii.getFile())) { | 229 reader = getReader(ii); |
221 getReader(ii); | |
222 } | |
223 // set up reader parameters | 230 // set up reader parameters |
224 ImageReadParam readParam = reader.getDefaultReadParam(); | 231 ImageReadParam readParam = reader.getDefaultReadParam(); |
225 readParam.setSourceRegion(region); | 232 readParam.setSourceRegion(region); |
226 if (prescale > 1) { | 233 if (prescale > 1) { |
227 readParam.setSourceSubsampling(prescale, prescale, 0, 0); | 234 readParam.setSourceSubsampling(prescale, prescale, 0, 0); |
335 + scaledImg.getHeight()); | 342 + scaledImg.getHeight()); |
336 img = scaledImg; | 343 img = scaledImg; |
337 } | 344 } |
338 | 345 |
339 public void blur(int radius) throws ImageOpException { | 346 public void blur(int radius) throws ImageOpException { |
340 // DEBUG | |
341 logger.debug("blur: " + radius); | 347 logger.debug("blur: " + radius); |
342 // minimum radius is 2 | 348 // minimum radius is 2 |
343 int klen = Math.max(radius, 2); | 349 int klen = Math.max(radius, 2); |
344 // FIXME: use constant kernels for most common sizes | 350 Kernel blur = null; |
345 int ksize = klen * klen; | 351 if (klen < convolutionKernels.length) { |
346 // kernel is constant 1/k | 352 blur = convolutionKernels[klen]; |
347 float f = 1f / ksize; | 353 } else { |
348 float[] kern = new float[ksize]; | 354 // calculate our own kernel |
349 for (int i = 0; i < ksize; i++) { | 355 int ksize = klen * klen; |
350 kern[i] = f; | 356 // kernel is constant 1/k |
351 } | 357 float f = 1f / ksize; |
352 Kernel blur = new Kernel(klen, klen, kern); | 358 float[] kern = new float[ksize]; |
359 for (int i = 0; i < ksize; ++i) { | |
360 kern[i] = f; | |
361 } | |
362 blur = new Kernel(klen, klen, kern); | |
363 } | |
353 // blur with convolve operation | 364 // blur with convolve operation |
354 ConvolveOp blurOp = new ConvolveOp(blur, ConvolveOp.EDGE_NO_OP, | 365 ConvolveOp blurOp = new ConvolveOp(blur, ConvolveOp.EDGE_NO_OP, |
355 renderHint); | 366 renderHint); |
356 BufferedImage blurredImg = null; | 367 BufferedImage blurredImg = null; |
357 // blur needs explicit destination image type for color *Java2D BUG* | 368 // blur needs explicit destination image type for color *Java2D BUG* |
413 scaleOp.filter(img, img); | 424 scaleOp.filter(img, img); |
414 } | 425 } |
415 | 426 |
416 /** | 427 /** |
417 * Ensures that the array f is in the right order to map the images RGB | 428 * Ensures that the array f is in the right order to map the images RGB |
418 * components. (not shure what happens | 429 * components. (not sure what happens otherwise) |
419 */ | 430 */ |
420 public float[] rgbOrdered(float[] fa) { | 431 public float[] rgbOrdered(float[] fa) { |
421 /* | 432 /* |
422 * TODO: this is UGLY, UGLY!! | 433 * TODO: this is UGLY, UGLY!! |
423 */ | 434 */ |