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[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(frame2, image.getHeight(frame2, 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 }