java输出扭曲验证码

  1. import java.awt.Color;   
  2. import java.awt.Font;   
  3. import java.awt.Graphics;   
  4. import java.awt.Graphics2D;   
  5. import java.awt.font.FontRenderContext;   
  6. import java.awt.font.TextLayout;   
  7. import java.awt.geom.AffineTransform;   
  8. import java.awt.image.BufferedImage;   
  9. import java.io.IOException;   
  10. import java.text.AttributedString;   
  11. import java.util.Random;   
  12.   
  13. import javax.servlet.ServletException;   
  14. import javax.servlet.http.HttpServlet;   
  15. import javax.servlet.http.HttpServletRequest;   
  16. import javax.servlet.http.HttpServletResponse;   
  17.   
  18. import com.sun.image.codec.jpeg.JPEGCodec;   
  19. import com.sun.image.codec.jpeg.JPEGImageEncoder;   
  20.   
  21.   
  22.   
  23. public class SimpleCaptcha extends HttpServlet {   
  24. private Random generator = new Random();   
  25. private final static String SIMPLE_CAPCHA_SESSION_KEY = "SIMPLE_CAPCHA_SESSION_KEY";   
  26.   
  27. private static char[] captchars = new char[] { 'a''b''c''d''e',   
  28.    '2''3''4''5''6''7''8''g''f''y''n''m''n',   
  29.    'p''w''x' };   
  30.   
  31. /**  
  32.   * 产生随机字体  
  33.   *  
  34.   * @return  
  35.   */   
  36. private Font getFont() {   
  37.   Random random = new Random();   
  38.   Font font[] = new Font[5];   
  39.   font[0] = new Font("Ravie", Font.PLAIN, 45);   
  40.   font[1] = new Font("Antique Olive Compact", Font.PLAIN, 45);   
  41.   font[2] = new Font("Forte", Font.PLAIN, 45);   
  42.   font[3] = new Font("Wide Latin", Font.PLAIN, 40);   
  43.   font[4] = new Font("Gill Sans Ultra Bold", Font.PLAIN, 45);   
  44.   return font[random.nextInt(5)];   
  45. }   
  46.   
  47. /**  
  48.   * 随机产生定义的颜色  
  49.   *  
  50.   * @return  
  51.   */   
  52. private Color getRandColor() {   
  53.   Random random = new Random();   
  54.   Color color[] = new Color[10];   
  55.   color[0] = new Color(3215825);   
  56.   color[1] = new Color(2184219);   
  57.   color[2] = new Color(3175208);   
  58.   return color[random.nextInt(3)];   
  59. }   
  60.   
  61. /**  
  62.   * @see javax.servlet.http.HttpServlet#void  
  63.   *      (javax.servlet.http.HttpServletRequest,  
  64.   *      javax.servlet.http.HttpServletResponse)  
  65.   */   
  66. public void doGet(HttpServletRequest req, HttpServletResponse resp)   
  67.    throws ServletException, IOException {   
  68.   
  69.   int ImageWidth = 200;   
  70.   int ImageHeight = 100;   
  71.   
  72.   int car = captchars.length - 1;   
  73.   /**  
  74.    * 产生随机字符串  
  75.    */   
  76.   String test = "";   
  77.   for (int i = 0; i < 4; i++) {   
  78.    test += captchars[generator.nextInt(car) + 1];   
  79.   }   
  80.   /**  
  81.    * 放放Session  
  82.    */   
  83.   req.getSession().setAttribute(SimpleCaptcha.SIMPLE_CAPCHA_SESSION_KEY,   
  84.     test);   
  85.   /**  
  86.    * 得到输出流  
  87.    */   
  88.   JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(resp   
  89.     .getOutputStream());   
  90.   
  91.   BufferedImage bi = new BufferedImage(ImageWidth + 10, ImageHeight,   
  92.     BufferedImage.TYPE_BYTE_INDEXED);   
  93.   
  94.   Graphics2D graphics = bi.createGraphics();   
  95.   
  96.   /**  
  97.    * 设置背景色  
  98.    */   
  99.   graphics.setColor(Color.white);   
  100.     
  101.   graphics.fillRect(00, bi.getWidth(), bi.getHeight());   
  102.   
  103.   graphics.setColor(Color.black);   
  104.   AttributedString attstr = new AttributedString(test);   
  105.   
  106.   TextLayout textTl = new TextLayout(test, new Font("Courier", Font.BOLD,   
  107.     70), new FontRenderContext(nulltruefalse));   
  108.   AffineTransform textAt = graphics.getTransform();   
  109.   graphics.setFont(new Font("Courier", Font.BOLD,70));   
  110.   graphics.setColor(this.getRandColor());   
  111.   graphics.drawString(test, 10,70);   
  112. //  textTl.draw(graphics, 4, 60);   
  113.   int w = bi.getWidth();   
  114.   int h = bi.getHeight();   
  115.   shear(graphics, w, h, Color.white);   
  116.   // this.drawThickLine(graphics, 0, generator.nextInt(ImageHeight) + 1,   
  117.   // ImageWidth, generator.nextInt(ImageHeight) + 1, 4, Color.BLACK);   
  118.   
  119.   resp.setContentType("image/jpg");   
  120.   
  121.   encoder.encode(bi);   
  122.   
  123. }   
  124.   
  125. private void shear(Graphics g, int w1, int h1, Color color) {   
  126.   
  127.   shearX(g, w1, h1, color);   
  128.   shearY(g, w1, h1, color);   
  129. }   
  130.   
  131. public void shearX(Graphics g, int w1, int h1, Color color) {   
  132.   
  133.   int period = generator.nextInt(2);   
  134.   
  135.   boolean borderGap = true;   
  136.   int frames = 1;   
  137.   int phase = generator.nextInt(2);   
  138.   
  139.   for (int i = 0; i < h1; i++) {   
  140.    double d = (double) (period >> 1)   
  141.      * Math.sin((double) i / (double) period   
  142.        + (6.2831853071795862D * (double) phase)   
  143.        / (double) frames);   
  144.    g.copyArea(0, i, w1, 1, (int) d, 0);   
  145.    if (borderGap) {   
  146.     g.setColor(color);   
  147.     g.drawLine((int) d, i, 0, i);   
  148.     g.drawLine((int) d + w1, i, w1, i);   
  149.    }   
  150.   }   
  151.   
  152. }   
  153.   
  154. public void shearY(Graphics g, int w1, int h1, Color color) {   
  155.   
  156.   int period = generator.nextInt(40) + 10// 50;   
  157.   
  158.   boolean borderGap = true;   
  159.   int frames = 20;   
  160.   int phase = 7;   
  161.   for (int i = 0; i < w1; i++) {   
  162.    double d = (double) (period >> 1)   
  163.      * Math.sin((double) i / (double) period   
  164.        + (6.2831853071795862D * (double) phase)   
  165.        / (double) frames);   
  166.    g.copyArea(i, 01, h1, 0, (int) d);   
  167.    if (borderGap) {   
  168.     g.setColor(color);   
  169.     g.drawLine(i, (int) d, i, 0);   
  170.     g.drawLine(i, (int) d + h1, i, h1);   
  171.    }   
  172.   
  173.   }   
  174.   
  175. }   
  176.   
  177. private void drawThickLine(Graphics g, int x1, int y1, int x2, int y2,   
  178.    int thickness, Color c) {   
  179.   
  180.   // The thick line is in fact a filled polygon   
  181.   g.setColor(c);   
  182.   int dX = x2 - x1;   
  183.   int dY = y2 - y1;   
  184.   // line length   
  185.   double lineLength = Math.sqrt(dX * dX + dY * dY);   
  186.   
  187.   double scale = (double) (thickness) / (2 * lineLength);   
  188.   
  189.   // The x and y increments from an endpoint needed to create a   
  190.   // rectangle...   
  191.   double ddx = -scale * (double) dY;   
  192.   double ddy = scale * (double) dX;   
  193.   ddx += (ddx > 0) ? 0.5 : -0.5;   
  194.   ddy += (ddy > 0) ? 0.5 : -0.5;   
  195.   int dx = (int) ddx;   
  196.   int dy = (int) ddy;   
  197.   
  198.   // Now we can compute the corner points...   
  199.   int xPoints[] = new int[4];   
  200.   int yPoints[] = new int[4];   
  201.   
  202.   xPoints[0] = x1 + dx;   
  203.   yPoints[0] = y1 + dy;   
  204.   xPoints[1] = x1 - dx;   
  205.   yPoints[1] = y1 - dy;   
  206.   xPoints[2] = x2 - dx;   
  207.   yPoints[2] = y2 - dy;   
  208.   xPoints[3] = x2 + dx;   
  209.   yPoints[3] = y2 + dy;   
  210.   
  211.   g.fillPolygon(xPoints, yPoints, 4);   
  212. }   
  213.   
  214. }   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值