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 }
|