diff servlet/src/digilib/image/JAIDocuImage.java @ 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 78f52a1876fe
children d87a7e2515af
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 {