FileDocCategorySizeDatePackage
DeColorize.javaAPI DocExample1978Tue Jan 25 10:45:14 GMT 2000None

DeColorize.java

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

import Acme.JPM.Encoders.*;

public class DeColorize extends HttpServlet {

  Hashtable gifs = new Hashtable();

  public void doGet(HttpServletRequest req, HttpServletResponse res)
                               throws ServletException, IOException {
    res.setContentType("image/gif");
    ServletOutputStream out = res.getOutputStream();

    // Get the image location from the path info
    String source = req.getPathTranslated();
    if (source == null) {
      throw new ServletException("Extra path information " +
                                 "must point to an image");
    }

    // Short circuit if it's been done before
    if (gifs.containsKey(source)) {
      ByteArrayOutputStream baos = (ByteArrayOutputStream) gifs.get(source);
      baos.writeTo(out);
      return;
    }

    // Construct an unshown frame
    // No addNotify() since its peer isn't needed
    Frame frame = new Frame();

    // Load the image
    Image image = Toolkit.getDefaultToolkit().getImage(source);
    MediaTracker mt = new MediaTracker(frame);
    mt.addImage(image, 0);
    try {
      mt.waitForAll();
    }
    catch (InterruptedException e) {
      getServletContext().log(e, "Interrupted while loading image");
      throw new ServletException(e.getMessage());
    }

    // Get the size of the image
    int width = image.getWidth(frame);
    int height = image.getHeight(frame);

    // Create an image to match, run through a filter
    Image filtered = frame.createImage(
      new FilteredImageSource(image.getSource(),
                              new GrayscaleImageFilter()));

    // Encode, store, and return the filtered image
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    GifEncoder encoder = new GifEncoder(filtered, baos);
    encoder.encode();
    gifs.put(source, baos);
    baos.writeTo(out);
  }
}