Newsgroup: it.comp.java
Titolo: Image e Testo

Salve a tutti,
E' tutto il pomeriggio che cerco di capire come produrre un'immagine con 
del testo verticale (orientato di 90gradi), da piazzare come output in 
una servlet.
Non e' che per caso qualcuno di voi ha gia' fatto qualcosa di simile e 
mi sa dare un occhio a questo codice?
   //[CUT]
   // Prelevo il contesto grafico
   Graphics2D sd = img.createGraphics();
   // Imposto l'antialiasing
   sd.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
       RenderingHints.VALUE_ANTIALIAS_ON);
   // Imposto il colore di sfondo
   sd.setBackground(Color.WHITE);
   // Imposto il colore del testo
   sd.setColor(Color.BLACK);
   sd.setFont(Font.getFont("Arial"));
   // E scrivo il testo.
   sd.drawString(text, 0, 0);
   // Trasformo l'immagine, per la rotazione di 90°
   sd.rotate(rotazione);
   // Comunico alla servlet il tipo di output
   resp.setContentType("image/jpeg");
   // Creo l'encoder gif
   GifEncoder ge = new GifEncoder(img, resp.getOutputStream());
   // Codifico l'immagine in formato gif
   ge.encode();
   // Infine chiudo l'outputStream della servlet.
   resp.getOutputStream().flush();
Il codice manca di tutto ancora, perche' richiamando la suddetta 
servlet, l'output generato e' un'immagine tutta nera.
Non riesco a capire la relazione che c'e' tra Graphics2D, 
AffineTransform e BufferedImage!!!
Qualcuno ha qualche idea o link in Italiano???
-- 
            Davide Gurgone
      web: 
http://www.gurgone.it/
mail: davidechiocciolinagurgonepuntoit

Davide wrote:
[CUT]
Ho risolto, ma da ancora qualche problema...
Praticamente creo l'immagine con una dimensione abb. fittizioa (10pixel 
per carattere) poi la ruoto dal centro del testo, infine la ritaglio.
Ho creato la versione servlet, perche' mi serviva quella.
[CODE]
package it.sweetvillage.image;
import Acme.JPM.Encoders.GifEncoder;
import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics2D;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.*;
public class ImgTextServlet extends HttpServlet {
   protected void doGet(HttpServletRequest req, HttpServletResponse resp)
     throws ServletException, java.io.IOException {
     String text = req.getParameter("text");
     text = (text==null||text.length()==0)?" ":text;
     String fontName = req.getParameter("fontName");
     fontName = (fontName==null||fontName.length()==0)?"Arial":fontName;
     int fontSize;
     try {
       fontSize = Integer.parseInt(req.getParameter("fontSize"));
     } catch (NumberFormatException e) {
       fontSize = 12;
     }
     int fontStyle;
     String sFontStyle = req.getParameter("fontStyle");
     if("bold".equalsIgnoreCase(sFontStyle))
       fontStyle = Font.BOLD;
     else if ("italic".equalsIgnoreCase(sFontStyle))
       fontStyle = Font.ITALIC;
     else if ("trueType".equalsIgnoreCase(sFontStyle))
       fontStyle = Font.TRUETYPE_FONT;
     else //if (sFontStyle == null || sFontStyle.length()==0)
       fontStyle = Font.PLAIN;
     int h = 10*text.length(); // 50
     int w = h;//100; // 200
     // Creo l'oggetto Image
     BufferedImage img = new BufferedImage(w,h,BufferedImage.TYPE_INT_RGB);
     // Creo l'oggetto Graphics
     Graphics2D gImg = img.createGraphics();
     // Imposto il colore di sfondo
     gImg.setBackground(Color.WHITE);
     gImg.clearRect(0,0,w,h);//200,50);
     // Imposto il colore del testo
     gImg.setColor(Color.BLACK);
     // Imposto il tipo di font
     gImg.setFont(new 
Font(fontName,fontStyle,fontSize));//Font.getFont("Arial-BOLD-12"));
     gImg.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
         RenderingHints.VALUE_ANTIALIAS_ON);
     // Una volta impostato il font, trovo altezza e larghezza della 
stringa.
     FontMetrics metric = gImg.getFontMetrics();
     int wText = metric.stringWidth(text);
     int hText = metric.getHeight();//getAscent();
     // get the existing transformation matrix to revert to when finished
     AffineTransform oldAT = gImg.getTransform();
     // create a new one for rotation
     AffineTransform newAT = new AffineTransform();
     /* Applico la rotazione. In altezza l'origine e' centrata, in larghezza
      * l'origine e' la meta' della dimensione reale della stringa. */
     newAT.rotate(-Math.PI/2,wText/2,h/2);//10,10);//as,ls);
     // apply newAT to G2D
     gImg.setTransform(newAT);
     /* Inserisco il testo a meta' dell'altezza dell'immagine -  meta'
      * dell'altezza del testo*/
     gImg.drawString(text,0,(h/2)+(hText/2));//+(hText/2));//0,0);// 
100,100);
     gImg.setTransform(oldAT);
     // Imposto il tipo di response
     resp.setContentType("image/gif");
     // Creo l'encoder gif
     GifEncoder ge = new GifEncoder(
         img.getSubimage(
             (wText/2)-(hText/2),//x
             (h-wText)/2,        //y
             hText,              //w
             wText),             //h
         resp.getOutputStream()
     );
     // Codifico l'immagine in formato gif
     ge.encode();
     // Infine chiudo l'outputStream della servlet.
     resp.getOutputStream().flush();
   }
   protected void doPost(HttpServletRequest req, HttpServletResponse resp)
     throws ServletException, java.io.IOException {
     doGet(req,resp);
   }
}
[/CODE]
Ciao,
