01 import java.awt.*;
02 import java.awt.image.*;
03 import java.io.*;
04 import javax.servlet.*;
05 import javax.servlet.http.*;
06
07 import Acme.JPM.Encoders.*;
08
09 public class GreyScaleServletCached extends HttpServlet {
10
11 // vytvoríme hash tabuľku
12 Hashtable gifs = new Hashtable();
13
14 public void doGet (HttpServletRequest req, HttpServletResponse res)
15 throws ServletException, IOException {
16 res.setContentType("image/gif");
17 ServletOutputStream out = res.getOutputStream();
18
19 // získame info o umiestnení obrázku
20 String source = req.getPathTranslated();
21 if (source == null) {
22 throw new ServletException("Chyba v umiestnení obrázku");
23 }
24
25 // ak skonvertovaný obrázok existuje, pošleme ho
26 if (gifs.containsKey(source)) {
27 ByteArrayOutputStream baos = (ByteArrayOutputStream) gifs.get(source);
28 baos.writeTo(out);
29 return;
30 }
31
32 /* vytvoríme viacnásobne použiteľný frame, pričom
33 tentokrát nepotrebujeme volať metódu addNotify() */
34 Frame frame = new Frame();
35
36 // natiahneme obrázok do pamäte
37 Image image = Toolkit.getDefaultToolkit().getImage(source);
38 MediaTracker mt = new MediaTracker(frame);
39 mt.addImage(image, 0);
40 try {
41 mt.waitForAll();
42 }
43 catch (InterruptedException e) {
44 getServletContext().log("Chyba pri načítaní obrázka", e);
45 throw new ServletException(e.getMessage());
46 }
47
48 // zistíme rozmery obrázku
49 int width = image.getWidth(frame);
50 int height = image.getHeight(frame);
51
52 // obrázok preženieme cez filter
53 Image filtered = frame.createImage(new FilteredImageSource(image.getSource(),new GreyScaleFilter()));
54
55 // obrázok zakódujeme, uložíme do Hashtable a pošleme
56 ByteArrayOutputStream baos = new ByteArrayOutputStream();
57 GifEncoder encoder = new GifEncoder(filtered, baos);
58 encoder.encode();
59 gifs.put(source, baos);
60 baos.writeTo(out);
61 }
62 }
|