# HG changeset patch # User robcast # Date 1061199495 -7200 # Node ID f52a7664a80750a83f2a257420bcbc3afb9d2920 # Parent 8b327d50696811769804e489dab86297b3a6cb7a Servlet version 1.12b3 - JAIImageLoaderDocuImage working again - smoother scaling with JAI and JAIImageLoader - Quality default now 1 diff -r 8b327d506968 -r f52a7664a807 servlet/src/digilib/image/JAIDocuImage.java --- 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 { diff -r 8b327d506968 -r f52a7664a807 servlet/src/digilib/image/JAIImageLoaderDocuImage.java --- 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."); } diff -r 8b327d506968 -r f52a7664a807 servlet/src/digilib/servlet/Scaler.java --- 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