解决了,应该使用JPEGImageDecoder,而不是什么ImageIO。哦耶,散分!

解决方案 »

  1.   

    /*
     * TestServlet.java
     * 创建日期 2005-7-20
     * 说明:
     */
    package common.servlet;import java.awt.Color;
    import java.awt.Font;
    import java.awt.Graphics;
    import java.awt.image.BufferedImage;
    import java.io.IOException;
    import java.util.Random;import javax.imageio.ImageIO;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;import com.sun.image.codec.jpeg.JPEGCodec;
    import com.sun.image.codec.jpeg.JPEGImageEncoder;/**
     * TestServlet
     * @author KeChuang <br>
     *         说明:生成四位随机数字验证码,并生成验证码图片。
     */
    public class AttachCode extends HttpServlet {
        private Random random = new Random();    public static void main(String[] args) throws IOException {
            BufferedImage image = new AttachCode().getImage("2234");
            ImageIO.write(image, "JPEG", System.out);
        }    /*
         * @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest,
         *      javax.servlet.http.HttpServletResponse)
         */
        protected void doGet(HttpServletRequest request,
                HttpServletResponse response) throws ServletException, IOException {
            response.setHeader("Pragma", "No-cache");
            response.setHeader("Cache-Control", "no-cache");
            response.setDateHeader("Expires", 0);
            response.setContentType("image/jpeg");
            HttpSession session = request.getSession();        String srand = getRand();
            session.setAttribute("attachCode", srand);
            System.out.println("---- random code is " + srand);
            BufferedImage image = getImage(srand);        JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(response
                    .getOutputStream());
            encoder.encode(image);
            //response.sendRedirect("main.html");
        }    /**
         * getRand <br>
         * <b>说明: </b> 生成验证码字符串
         * @return
         */
        private String getRand() {        int rnd = random.nextInt(10000);
            if (rnd < 1000)
                rnd = 9999 - rnd;
            return String.valueOf(rnd);
        }    /**
         * getImage <br>
         * <b>说明: </b> 根据验证码字符串生成图片
         * @param srand
         *            要生成的验证码
         * @return
         */
        private BufferedImage getImage(String srand) {
            int topmargin = 0;
            int width = 55, height = 20 + topmargin;
            BufferedImage image = new BufferedImage(width, height,
                    BufferedImage.TYPE_INT_RGB);
            Graphics g = image.getGraphics();
            //图片的背景比较明亮
            g.setColor(Color.WHITE);
            g.fillRect(0, 0, width, height);
            g.setColor(getRandColor(220, 255, false));
            g.fillRect(0, topmargin, width, height);
            g.setFont(new Font("Arial", Font.BOLD, 20));        //绘制干扰线
            for (int i = 0; i < 3; i++) {
                g.setColor(getRandColor(20, 80, true));
                int x = random.nextInt(width / 4);
                int y = random.nextInt(height - topmargin) + topmargin;
                int xl = random.nextInt(width / 4) + 3 * width / 4;
                int yl = random.nextInt(height - topmargin) + topmargin;
                g.drawLine(x, y, xl, yl);
            }
            for (int i = 0; i < 4; i++) {
                g.setColor(getRandColor(20, 80, true));
                g.drawString(srand.substring(i, i + 1), 13 * i + 3, 18 + topmargin);
            }
            g.dispose();
            return image;
        }    /**
         * getRandColor <br>
         * <b>说明: </b> 给定范围获得随机颜色
         * @param fc
         * @param bc
         * @return
         */
        private Color getRandColor(int fc, int bc, boolean highlight) {
            int hilight = -1;
            if (highlight)
                hilight = random.nextInt(3);
            int[] c = new int[3];
            for (int i = 0; i < 3; i++) {
                c[i] = random.nextInt(bc - fc) + fc;
                if (hilight == i) {
                    c[i] += 70;
                    if (c[i] > 255)
                        c[i] = 255;
                }
            }
            return new Color(c[0], c[1], c[2]);
        }
    }