changeset 142:f52a7664a807

Servlet version 1.12b3 - JAIImageLoaderDocuImage working again - smoother scaling with JAI and JAIImageLoader - Quality default now 1
author robcast
date Mon, 18 Aug 2003 11:38:15 +0200
parents 8b327d506968
children 81937cc5c743
files servlet/src/digilib/image/JAIDocuImage.java servlet/src/digilib/image/JAIImageLoaderDocuImage.java servlet/src/digilib/servlet/Scaler.java
diffstat 3 files changed, 108 insertions(+), 35 deletions(-) [+]
line wrap: on
line diff
--- a/servlet/src/digilib/image/JAIDocuImage.java	Fri Aug 15 23:53:23 2003 +0200
+++ b/servlet/src/digilib/image/JAIDocuImage.java	Mon Aug 18 11:38:15 2003 +0200
@@ -27,7 +27,11 @@
 import java.io.IOException;
 import java.io.OutputStream;
 
-import javax.media.jai.*;
+import javax.media.jai.BorderExtender;
+import javax.media.jai.Interpolation;
+import javax.media.jai.JAI;
+import javax.media.jai.KernelJAI;
+import javax.media.jai.ParameterBlockJAI;
 import javax.media.jai.operator.TransposeDescriptor;
 import javax.media.jai.operator.TransposeType;
 
@@ -126,22 +130,28 @@
 
 	/* scales the current image */
 	public void scale(double scale) throws ImageOpException {
-		float sf = (float) scale;
-		// setup scale
-		ParameterBlock param = new ParameterBlock();
-		param.addSource(img);
-		param.add(sf);
-		param.add(sf);
-		param.add(0f);
-		param.add(0f);
-		param.add(interpol);
-		// hint with border extender
-		RenderingHints hint =
-			new RenderingHints(
-				JAI.KEY_BORDER_EXTENDER,
-				BorderExtender.createInstance(BorderExtender.BORDER_COPY));
-
-		RenderedImage scaledImg = JAI.create("scale", param, hint);
+		RenderedImage scaledImg = null;
+		if ((scale < 1)
+			&& (img.getColorModel().getPixelSize() == 1)
+			&& (quality > 0)) {
+			/*
+			 * "SubsampleBinaryToGray" for downscaling BW
+			 */
+			scaledImg = scaleBinary((float) scale, img);
+		} else if ((scale <= 0.5) && (quality > 1)) {
+			/*
+			 * blur and "Scale" for downscaling color images
+			 */
+			int subsample = (int) Math.floor(1 / scale);
+			RenderedImage prescaledImg = img;
+			prescaledImg = blur(subsample, img);
+			scaledImg = scaleAll((float) scale, prescaledImg);
+		} else {
+			/*
+			 * "Scale" for the rest
+			 */
+			scaledImg = scaleAll((float) scale, img);
+		}
 
 		//DEBUG
 		util.dprintln(
@@ -160,6 +170,68 @@
 		img = scaledImg;
 	}
 
+	private RenderedImage scaleAll(float scale, RenderedImage image) {
+		RenderedImage scaledImg;
+		//DEBUG
+		util.dprintln(4, "scaleAll: " + scale);
+		ParameterBlockJAI param = new ParameterBlockJAI("Scale");
+		param.addSource(image);
+		param.setParameter("xScale", scale);
+		param.setParameter("yScale", scale);
+		param.setParameter("interpolation", interpol);
+		// hint with border extender
+		RenderingHints hint =
+			new RenderingHints(
+				JAI.KEY_BORDER_EXTENDER,
+				BorderExtender.createInstance(BorderExtender.BORDER_COPY));
+		// scale
+		scaledImg = JAI.create("Scale", param, hint);
+		return scaledImg;
+	}
+
+	private RenderedImage blur(int radius, RenderedImage image) {
+		RenderedImage blurredImg;
+		//DEBUG
+		util.dprintln(4, "blur: " + radius);
+		int klen = Math.max(radius, 2);
+		int ksize = klen * klen;
+		float f = 1f / ksize;
+		float[] kern = new float[ksize];
+		for (int i = 0; i < ksize; i++) {
+			kern[i] = f;
+		}
+		KernelJAI blur = new KernelJAI(klen, klen, kern);
+		ParameterBlockJAI param = new ParameterBlockJAI("Convolve");
+		param.addSource(image);
+		param.setParameter("kernel", blur);
+		// hint with border extender
+		RenderingHints hint =
+			new RenderingHints(
+				JAI.KEY_BORDER_EXTENDER,
+				BorderExtender.createInstance(BorderExtender.BORDER_COPY));
+		blurredImg = JAI.create("Convolve", param, hint);
+		return blurredImg;
+	}
+
+	RenderedImage scaleBinary(float scale, RenderedImage image) {
+		RenderedImage scaledImg;
+		//DEBUG
+		util.dprintln(4, "scaleBinary: " + scale);
+		ParameterBlockJAI param =
+			new ParameterBlockJAI("SubsampleBinaryToGray");
+		param.addSource(image);
+		param.setParameter("xScale", scale);
+		param.setParameter("yScale", scale);
+		// hint with border extender
+		RenderingHints hint =
+			new RenderingHints(
+				JAI.KEY_BORDER_EXTENDER,
+				BorderExtender.createInstance(BorderExtender.BORDER_COPY));
+		// scale
+		scaledImg = JAI.create("SubsampleBinaryToGray", param, hint);
+		return scaledImg;
+	}
+
 	/* crops the current image */
 	public void crop(int x_off, int y_off, int width, int height)
 		throws ImageOpException {
--- a/servlet/src/digilib/image/JAIImageLoaderDocuImage.java	Fri Aug 15 23:53:23 2003 +0200
+++ b/servlet/src/digilib/image/JAIImageLoaderDocuImage.java	Mon Aug 18 11:38:15 2003 +0200
@@ -34,7 +34,6 @@
 import javax.imageio.ImageReader;
 import javax.imageio.stream.ImageInputStream;
 import javax.media.jai.JAI;
-import javax.media.jai.ParameterBlockJAI;
 
 import digilib.io.DocuFile;
 import digilib.io.FileOpException;
@@ -93,6 +92,20 @@
 		}
 	}
 
+	/* Get an ImageReader for the image file. */
+	public void preloadImage(File f) throws IOException {
+		System.gc();
+		RandomAccessFile rf = new RandomAccessFile(f, "r");
+		ImageInputStream istream = ImageIO.createImageInputStream(rf);
+		Iterator readers = ImageIO.getImageReaders(istream);
+		reader = (ImageReader) readers.next();
+		reader.setInput(istream);
+		if (reader == null) {
+			util.dprintln(3, "ERROR(loadImage): unable to load file");
+			throw new FileOpException("Unable to load File!");
+		}
+	}
+
 	/* Load an image file into the Object. */
 	public void loadSubimage(File f, Rectangle region, int prescale)
 		throws FileOpException {
@@ -105,11 +118,14 @@
 			ImageReadParam readParam = reader.getDefaultReadParam();
 			readParam.setSourceRegion(region);
 			readParam.setSourceSubsampling(prescale, prescale, 0, 0);
+			img = reader.read(0, readParam);
+			/* JAI imageread seems to ignore the readParam :-(
 			ParameterBlockJAI pb = new ParameterBlockJAI("imageread");
 			pb.setParameter("Input", istream);
 			pb.setParameter("ReadParam", readParam);
 			pb.setParameter("Reader", reader);
 			img = JAI.create("imageread", pb);
+			*/
 		} catch (IOException e) {
 			util.dprintln(3, "ERROR(loadImage): unable to load file");
 			throw new FileOpException("Unable to load File!");
@@ -121,20 +137,6 @@
 		imgFile = f;
 	}
 
-	/* Get an ImageReader for the image file. */
-	public void preloadImage(File f) throws IOException {
-		System.gc();
-		RandomAccessFile rf = new RandomAccessFile(f, "r");
-		ImageInputStream istream = ImageIO.createImageInputStream(rf);
-		Iterator readers = ImageIO.getImageReaders(istream);
-		reader = (ImageReader) readers.next();
-		reader.setInput(istream);
-		if (reader == null) {
-			util.dprintln(3, "ERROR(loadImage): unable to load file");
-			throw new FileOpException("Unable to load File!");
-		}
-	}
-
 	/* Write the current image to an OutputStream. */
 	public void writeImage(String mt, OutputStream ostream)
 		throws FileOpException {
@@ -154,7 +156,6 @@
 			}
 			// render output
 			JAI.create("ImageWrite", pb3);
-
 		} catch (IOException e) {
 			throw new FileOpException("Error writing image.");
 		}
--- a/servlet/src/digilib/servlet/Scaler.java	Fri Aug 15 23:53:23 2003 +0200
+++ b/servlet/src/digilib/servlet/Scaler.java	Mon Aug 18 11:38:15 2003 +0200
@@ -58,7 +58,7 @@
 public class Scaler extends HttpServlet {
 
 	// digilib servlet version (for all components)
-	public static final String dlVersion = "1.12b2";
+	public static final String dlVersion = "1.12b3";
 
 	// Utils instance with debuglevel
 	Utils util;
@@ -178,7 +178,7 @@
 		// use hires images (if autoRes == false) 
 		boolean hiresOnly = false;
 		// interpolation to use for scaling
-		int scaleQual = 0;
+		int scaleQual = 1;
 		// send html error message (or image file)
 		boolean errorMsgHtml = false;
 		// mirror the image