生成一个验证码的问题

如何让字体在图片中上下左右居中显示?
package cn.com.webpro.web.actions.util;

import javax.servlet.*;
import javax.servlet.http.*;

import java.io.*;
import java.awt.*;
import java.awt.image.*;
import java.util.*;
import javax.imageio.*;

import org.apache.struts2.ServletActionContext;

import cn.com.webpro.web.actions.base.BaseAction;

/**

  • 图片验证
  • @author Pitt
    */
    public class VertifyAction extends BaseAction{

    private static final long serialVersionUID = 1L;

    //定义图形验证码中绘制字符的字体
    private final Font mFont = new Font("Arial Black", Font.PLAIN, 23);

    //定义图形验证码的大小
    private final int IMG_WIDTH = 155;
    private final int IMG_HEIGTH = 28;

    //定义一个获取随机颜色的方法
    private Color getRandColor(int fc,int bc){
    Random random = new Random();
    if(fc > 255) fc = 255;
    if(bc > 255) bc=255;
    int r = fc + random.nextInt(bc - fc);
    int g = fc + random.nextInt(bc - fc);
    int b = fc + random.nextInt(bc - fc);
    //得到随机颜色
    return new Color(r , g , b);
    }

    //重写service方法,生成对客户端的响应
    public String execute()throws ServletException, IOException {
    HttpServletResponse response=ServletActionContext.getResponse();
    HttpServletRequest request=ServletActionContext.getRequest();
    //设置禁止缓存
    response.setHeader("Pragma","No-cache");
    response.setHeader("Cache-Control","no-cache");
    response.setDateHeader("Expires", 0);
    response.setContentType("image/jpeg");
    BufferedImage image = new BufferedImage(IMG_WIDTH , IMG_HEIGTH , BufferedImage.TYPE_INT_RGB);
    Graphics g = image.getGraphics();
    Random random = new Random();
    g.setColor(getRandColor(200 , 250));
    //填充背景色
    g.fillRect(1, 1, IMG_WIDTH - 1, IMG_HEIGTH - 1);

    //为图形验证码绘制边框
    g.setColor(new Color(102 , 102 , 102));
    g.drawRect(0, 0, IMG_WIDTH - 1, IMG_HEIGTH - 1);
    g.setColor(getRandColor(160,200));
    
    //生成随机干扰线
    for (int i = 0 ; i < 80 ; i++){
        int x = random.nextInt(IMG_WIDTH - 1);
        int y = random.nextInt(IMG_HEIGTH - 1);
        int xl = random.nextInt(6) + 1;
        int yl = random.nextInt(12) + 1;
        g.drawLine(x , y , x + xl , y + yl);
    }
    g.setColor(getRandColor(160,200));
    
    //生成随机干扰线
    for (int i = 0 ; i < 80 ; i++){
        int x = random.nextInt(IMG_WIDTH - 1);
        int y = random.nextInt(IMG_HEIGTH - 1);
        int xl = random.nextInt(12) + 1;
        int yl = random.nextInt(6) + 1;
        g.drawLine(x , y , x - xl , y - yl);
    }
    //设置绘制字符的字体
    g.setFont(mFont);
    //用于保存系统生成的随机字符串
    String sRand = "";
    for (int i = 0 ; i < 6 ; i++){
        String tmp = getRandomChar();
        sRand += tmp;
        //获取随机颜色
        g.setColor(new Color(20 + random.nextInt(110)
            ,20 + random.nextInt(110)
            ,20 + random.nextInt(110)));
        //在图片上绘制系统生成的随机字符
        g.drawString(tmp , 15 * i + 10,15);
    }
    //获取HttpSesssion对象
    HttpSession session = request.getSession(true);
    //将随机字符串放入HttpSesssion对象中 
    session.setAttribute("rand" , sRand);
    g.dispose();
    //向输出流中输出图片
    ImageIO.write(image, "JPEG", response.getOutputStream());
    return null;
    

    }

    //定义获取随机字符串方法
    private String getRandomChar(){
    //生成一个0、1、2的随机数字
    // int rand = (int)Math.round(Math.random() * 2);
    long itmp = 0;
    // char ctmp = '\u0000';
    // switch (rand)
    // {
    // //生成大写字母
    // case 1:
    // itmp = Math.round(Math.random() * 25 + 65);
    // ctmp = (char)itmp;
    // return String.valueOf(ctmp);
    // //生成小写字母
    // case 2:
    // itmp = Math.round(Math.random() * 25 + 97);
    // ctmp = (char)itmp;
    // return String.valueOf(ctmp);
    //生成数字
    // default :
    itmp = Math.round(Math.random() * 9);
    return itmp + "";
    // }
    }

}

效果图:附件。

[code="java"]int startPosX = (IMG_WIDTH - widthNeeded) / 2; [/code]

[code="java"]
public abstract void drawString(String str,
int x,
int y)

使用此图形上下文的当前字体和颜色绘制由指定 string 给定的文本。最左侧字符的基线位于此图形上下文坐标系统的 (x, y) 位置处。

参数:
    str - 要绘制的 string。
    x - x 坐标。
    y - y 坐标。

g.drawString(tmp , 15 * i + 10,15); 你这个绘制得位置是随机得 因此这个地方要设置成 整个举行得 x y 得一半位置
[/code]

可以定义两个变量 startPosY startPosX,计算字符串的位子,然后作为参数传给drawString

类似于这样,具体的size 位置可以自己调整
[code="java"]int fontSize = mFont.getSize();
int startPosY = (IMG_WIDTH - fontSize) / 5 + fontSize;
int widthNeeded = fontSize * 6;

int startPosX = (width - widthNeeded) / 2;

for (int i = 0 ; i < 6 ; i++){
String tmp = getRandomChar();
sRand += tmp;
//获取随机颜色
g.setColor(new Color(20 + random.nextInt(110)
,20 + random.nextInt(110)
,20 + random.nextInt(110)));
//在图片上绘制系统生成的随机字符
g.drawString(tmp , 15 * i + startPosX ,startPosY );
} [/code]