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 ShrinkFilterServlet extends HttpServlet { 
10 
11  public void doGet(HttpServletRequest req, HttpServletResponse res) 
12                      throws ServletException, IOException { 
13  
14   ServletOutputStream out = res.getOutputStream(); 
15 
16   String contType = req.getContentType(); 
17   if (contType == null || !contType.startsWith("image")) { 
18      throw new ServletException("Chýba content type, musí byť \"image/*\""); 
19   } 
20 
21   // získame dáta obsahujúce obrázok 
22   DataInputStream in = new DataInputStream(new BufferedInputStream(req.getInputStream())); 
23   ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
24   byte[] buf = new byte[4 * 1024]; // 4K buffer 
25   int len; 
26   while ((len = in.read(buf, 0, buf.length)) != -1) { 
27    baos.write(buf, 0, len); 
28   } 
29 
30   // vytvoríme objekt image 
31   Image image = Toolkit.getDefaultToolkit().createImage(baos.toByteArray()); 
32 
33   // vytvoríme ale nezobrazíme frame 
34   Frame frame = new Frame(); 
35 
36   // natiahneme obrázok a získame jeho výšku a šírku 
37   MediaTracker mt = new MediaTracker(frame); 
38   mt.addImage(image, 0); 
39   try { 
40    mt.waitForAll(); 
41   } 
42   catch (InterruptedException e) { 
43    getServletContext().log("Chyba pri načítaní obrázka.", e); 
44    throw new ServletException(e.getMessage()); 
45   } 
46 
47   /* Zmenšíme rozmery obrázku na polovicu. 
48   Vylepšená verzia servletu by mohla získať 
49   požadovaný pomer strán z inicializačných parametrov. 
50   Ako alternatívu by sme mohli využiť triedu 
51   java.awt.image.AreaAveragingScaleFilter, alebo triedu 
52   java.awt.image.ReplicateScaleFilter. */ 
53   Image shrunk = image.getScaledInstance(image.getWidth(frame) / 2, image.getHeight(frame) / 2, image.SCALE_DEFAULT); 
54 
55   // zmenšený obrázok zakódujeme a pošleme 
56   res.setContentType("image/gif"); 
57   GifEncoder encoder = new GifEncoder(shrunk, out); 
58   encoder.encode(); 
59  } 
60 }