diff 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
line wrap: on
line diff
--- a/servlet/src/digilib/image/ImageLoaderDocuImage.java	Thu Jan 06 17:33:01 2011 +0100
+++ b/servlet/src/digilib/image/ImageLoaderDocuImage.java	Thu Jan 06 20:42:29 2011 +0100
@@ -29,7 +29,6 @@
 import java.awt.image.ConvolveOp;
 import java.awt.image.Kernel;
 import java.awt.image.RescaleOp;
-import java.io.File;
 import java.io.IOException;
 import java.io.OutputStream;
 import java.io.RandomAccessFile;
@@ -53,7 +52,7 @@
 
 /** Implementation of DocuImage using the ImageLoader API of Java 1.4 and Java2D. */
 public class ImageLoaderDocuImage extends ImageInfoDocuImage {
-
+    
 	/** image object */
 	protected BufferedImage img;
 	
@@ -63,9 +62,14 @@
 	/** ImageIO image reader */
 	protected ImageReader reader;
 
-	/** File that was read */
-	protected File imgFile;
-
+	protected static Kernel[] convolutionKernels = {
+	        null,
+	        new Kernel(1, 1, new float[] {1f}),
+            new Kernel(2, 2, new float[] {0.25f, 0.25f, 0.25f, 0.25f}),
+            new Kernel(3, 3, new float[] {1f/9f, 1f/9f, 1f/9f, 1f/9f, 1f/9f, 1f/9f, 1f/9f, 1f/9f, 1f/9f})
+	};
+	
+	
 	/* loadSubimage is supported. */
 	public boolean isSubimageSupported() {
 		return true;
@@ -128,7 +132,12 @@
         /*
          * try ImageReader
          */
-        reader = getReader(input);
+        try {
+            reader = getReader(input);
+        } catch (FileOpException e) {
+            // maybe just our class doesn't know what to do
+            return null;
+        }
         // set size
         ImageSize d = new ImageSize(reader.getWidth(0), reader.getHeight(0));
         input.setSize(d);
@@ -174,7 +183,7 @@
 				logger.debug("reusing Reader");
 				return reader;
 			}
-			// clean up old reader
+			// clean up old reader (this shouldn't really happen)
 			logger.debug("cleaning Reader!");
 			dispose();
 		}
@@ -217,9 +226,7 @@
 			throws FileOpException {
 		logger.debug("loadSubimage");
 		try {
-			if ((reader == null) || (imgFile != ii.getFile())) {
-				getReader(ii);
-			}
+			reader = getReader(ii);
 			// set up reader parameters
 			ImageReadParam readParam = reader.getDefaultReadParam();
 			readParam.setSourceRegion(region);
@@ -337,19 +344,23 @@
 	}
 
 	public void blur(int radius) throws ImageOpException {
-		// DEBUG
 		logger.debug("blur: " + radius);
 		// minimum radius is 2
 		int klen = Math.max(radius, 2);
-		// FIXME: use constant kernels for most common sizes
-		int ksize = klen * klen;
-		// kernel is constant 1/k
-		float f = 1f / ksize;
-		float[] kern = new float[ksize];
-		for (int i = 0; i < ksize; i++) {
-			kern[i] = f;
+		Kernel blur = null;
+		if (klen < convolutionKernels.length) {
+            blur = convolutionKernels[klen];
+		} else {
+            // calculate our own kernel
+            int ksize = klen * klen;
+            // kernel is constant 1/k
+            float f = 1f / ksize;
+            float[] kern = new float[ksize];
+            for (int i = 0; i < ksize; ++i) {
+                kern[i] = f;
+            }
+            blur = new Kernel(klen, klen, kern);
 		}
-		Kernel blur = new Kernel(klen, klen, kern);
 		// blur with convolve operation
 		ConvolveOp blurOp = new ConvolveOp(blur, ConvolveOp.EDGE_NO_OP,
 				renderHint);
@@ -415,7 +426,7 @@
 
 	/**
 	 * Ensures that the array f is in the right order to map the images RGB
-	 * components. (not shure what happens
+	 * components. (not sure what happens otherwise)
 	 */
 	public float[] rgbOrdered(float[] fa) {
 		/*