view servlet/src/digilib/image/JAIImageLoaderDocuImage.java @ 71:d493563ef672

New servlet version 1.5b. Mostly cleanup. Global parameters for digilib now in DigilibConfiguration, per request parameters are now all in DigilibRequest. The DocuImage implementation can be selected by the configuration docuimage-class. Pixel-by-pixel view implemented with "mo=clip".
author robcast
date Fri, 24 Jan 2003 21:40:59 +0100
parents 5ea1999befd4
children 3b8797fc3e90
line wrap: on
line source

/* JAIImageLoaderDocuImage -- Image class implementation using JAI's ImageLoader Plugin

  Digital Image Library servlet components

  Copyright (C) 2001, 2002 Robert Casties (robcast@mail.berlios.de)

  This program is free software; you can redistribute  it and/or modify it
  under  the terms of  the GNU General  Public License as published by the
  Free Software Foundation;  either version 2 of the  License, or (at your
  option) any later version.
   
  Please read license.txt for the full details. A copy of the GPL
  may be found at http://www.gnu.org/copyleft/lgpl.html

  You should have received a copy of the GNU General Public License
  along with this program; if not, write to the Free Software
  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

*/

package digilib.image;

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;

import java.awt.*;
import java.awt.image.*;
import java.awt.image.renderable.*;
import javax.media.jai.*;

import digilib.*;
import digilib.io.*;


public class JAIImageLoaderDocuImage extends DocuImageImpl {

  private RenderedImage img;

  public JAIImageLoaderDocuImage() {
  }

  public JAIImageLoaderDocuImage(Utils u) {
    util = u;
  }

  /**
   *  load image file
   */
  public void loadImage(File f) throws FileOpException {
    System.gc();
    img = JAI.create("ImageRead", f.getAbsolutePath());
    if (img == null) {
      util.dprintln(3, "ERROR(loadImage): unable to load file");
      throw new FileOpException("Unable to load File!");
    }
  }

  /**
   *  write image of type mt to Stream
   */
  public void writeImage(String mt, ServletResponse res)
         throws FileOpException {
    try {
    // setup output
    ParameterBlock pb3 = new ParameterBlock();
    pb3.addSource(img);
    pb3.add(res.getOutputStream());
    if (mt == "image/jpeg") {
      pb3.add("JPEG");
    } else if (mt == "image/png") {
      pb3.add("PNG");
    } else {
      // unknown mime type
      util.dprintln(2, "ERROR(writeImage): Unknown mime type "+mt);
      throw new FileOpException("Unknown mime type: "+mt);
    }
    res.setContentType(mt);
    // render output
    JAI.create("ImageWrite", pb3);

    } catch (IOException e) {
      throw new FileOpException("Error writing image.");
    }
  }

  public int getWidth() {
    if (img != null) {
      return img.getWidth();
    }
    return 0;
  }

  public int getHeight() {
    if (img != null) {
      return img.getHeight();
    }
    return 0;
  }


  /**
   *  crop and scale image
   *    take rectangle width,height at position x_off,y_off
   *    and scale by scale
   */
   public void cropAndScale(int x_off, int y_off, int width, int height,
         float scale, int qual) throws ImageOpException {

    Interpolation scaleInt = null;
    // setup interpolation quality
    if (qual > 1) {
      util.dprintln(4, "quality q2");
      scaleInt = Interpolation.getInstance(Interpolation.INTERP_BICUBIC);
    } else if (qual == 1) {
      util.dprintln(4, "quality q1");
      scaleInt = Interpolation.getInstance(Interpolation.INTERP_BILINEAR);
    } else {
      util.dprintln(4, "quality q0");
      scaleInt = Interpolation.getInstance(Interpolation.INTERP_NEAREST);
    }

    // setup Crop
    ParameterBlock pb1 = new ParameterBlock();
    pb1.addSource(img);
    pb1.add((float)x_off);
    pb1.add((float)y_off);
    pb1.add((float)width);
    pb1.add((float)height);
    RenderedImage croppedImg = JAI.create("crop", pb1);
    img = null; // free img

    util.dprintln(3, "CROP:"+croppedImg.getWidth()+"x"+croppedImg.getHeight()); //DEBUG

    if (croppedImg == null) {
      util.dprintln(2, "ERROR(cropAndScale): error in crop");
      throw new ImageOpException("Unable to crop");
    }

    // setup scale
    ParameterBlock pb2 = new ParameterBlock();
    pb2.addSource(croppedImg);
    pb2.add(scale);
    pb2.add(scale);
    pb2.add(0f);
    pb2.add(0f);
    pb2.add(scaleInt);
    // the following is nice but way too slow...
    //if (opCrop.getColorModel().getPixelSize() < 8) {
    // change color model if necessary
    //  util.dprintln("converting color model...");
    //  BufferedImage bi = new BufferedImage(1, 1, BufferedImage.TYPE_BYTE_GRAY);
    //  ImageLayout lay = new ImageLayout(bi);
    //  rh = new RenderingHints(JAI.KEY_IMAGE_LAYOUT, lay);
    //}
    RenderedImage scaledImg = JAI.create("scale", pb2);
    croppedImg = null; // free opCrop

    if (scaledImg == null) {
      util.dprintln(2, "ERROR(cropAndScale): error in scale");
      throw new ImageOpException("Unable to scale");
    }

    img = scaledImg;
  }

}