久久精品精选,精品九九视频,www久久只有这里有精品,亚洲熟女乱色综合一区
    分享

    java輸出扭曲驗證碼 (效果很好)

     CevenCheng 2012-11-30
    import java.awt.Color; 
    import java.awt.Font; 
    import java.awt.Graphics; 
    import java.awt.Graphics2D; 
    import java.awt.font.FontRenderContext; 
    import java.awt.font.TextLayout; 
    import java.awt.geom.AffineTransform; 
    import java.awt.image.BufferedImage; 
    import java.io.IOException; 
    import java.text.AttributedString; 
    import java.util.Random; 

    import javax.servlet.ServletException; 
    import javax.servlet.http.HttpServlet; 
    import javax.servlet.http.HttpServletRequest; 
    import javax.servlet.http.HttpServletResponse; 

    import com.sun.image.codec.jpeg.JPEGCodec; 
    import com.sun.image.codec.jpeg.JPEGImageEncoder; 



    public class SimpleCaptcha extends HttpServlet { 
    private Random generator = new Random(); 
    private final static String SIMPLE_CAPCHA_SESSION_KEY = "SIMPLE_CAPCHA_SESSION_KEY"; 

    private static char[] captchars = new char[] { 'a', 'b', 'c', 'd', 'e', 
       '2', '3', '4', '5', '6', '7', '8', 'g', 'f', 'y', 'n', 'm', 'n', 
       'p', 'w', 'x' }; 

    /** 
      * 產生隨機字體 
      * 
      * @return 
      */ 
    private Font getFont() { 
      Random random = new Random(); 
      Font font[] = new Font[5]; 
      font[0] = new Font("Ravie", Font.PLAIN, 45); 
      font[1] = new Font("Antique Olive Compact", Font.PLAIN, 45); 
      font[2] = new Font("Forte", Font.PLAIN, 45); 
      font[3] = new Font("Wide Latin", Font.PLAIN, 40); 
      font[4] = new Font("Gill Sans Ultra Bold", Font.PLAIN, 45); 
      return font[random.nextInt(5)]; 


    /** 
      * 隨機產生定義的顏色 
      * 
      * @return 
      */ 
    private Color getRandColor() { 
      Random random = new Random(); 
      Color color[] = new Color[10]; 
      color[0] = new Color(32, 158, 25); 
      color[1] = new Color(218, 42, 19); 
      color[2] = new Color(31, 75, 208); 
      return color[random.nextInt(3)]; 


    /** 
      * @see javax.servlet.http.HttpServlet#void 
      *      (javax.servlet.http.HttpServletRequest, 
      *      javax.servlet.http.HttpServletResponse) 
      */ 
    public void doGet(HttpServletRequest req, HttpServletResponse resp) 
       throws ServletException, IOException { 

      int ImageWidth = 200; 
      int ImageHeight = 100; 

      int car = captchars.length - 1; 
      /** 
       * 產生隨機字符串 
       */ 
      String test = ""; 
      for (int i = 0; i < 4; i++) { 
       test += captchars[generator.nextInt(car) + 1]; 
      } 
      /** 
       * 放放Session 
       */ 
      req.getSession().setAttribute(SimpleCaptcha.SIMPLE_CAPCHA_SESSION_KEY, 
        test); 
      /** 
       * 得到輸出流 
       */ 
      JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(resp 
        .getOutputStream()); 

      BufferedImage bi = new BufferedImage(ImageWidth + 10, ImageHeight, 
        BufferedImage.TYPE_BYTE_INDEXED); 

      Graphics2D graphics = bi.createGraphics(); 

      /** 
       * 設置背景色 
       */ 
      graphics.setColor(Color.white); 
      
      graphics.fillRect(0, 0, bi.getWidth(), bi.getHeight()); 

      graphics.setColor(Color.black); 
      AttributedString attstr = new AttributedString(test); 

      TextLayout textTl = new TextLayout(test, new Font("Courier", Font.BOLD, 
        70), new FontRenderContext(null, true, false)); 
      AffineTransform textAt = graphics.getTransform(); 
      graphics.setFont(new Font("Courier", Font.BOLD,70)); 
      graphics.setColor(this.getRandColor()); 
      graphics.drawString(test, 10,70); 
    //  textTl.draw(graphics, 4, 60); 
      int w = bi.getWidth(); 
      int h = bi.getHeight(); 
      shear(graphics, w, h, Color.white); 
      // this.drawThickLine(graphics, 0, generator.nextInt(ImageHeight) + 1, 
      // ImageWidth, generator.nextInt(ImageHeight) + 1, 4, Color.BLACK); 

      resp.setContentType("image/jpg"); 

      encoder.encode(bi); 



    private void shear(Graphics g, int w1, int h1, Color color) { 

      shearX(g, w1, h1, color); 
      shearY(g, w1, h1, color); 


    public void shearX(Graphics g, int w1, int h1, Color color) { 

      int period = generator.nextInt(2); 

      boolean borderGap = true; 
      int frames = 1; 
      int phase = generator.nextInt(2); 

      for (int i = 0; i < h1; i++) { 
       double d = (double) (period >> 1) 
         * Math.sin((double) i / (double) period 
           + (6.2831853071795862D * (double) phase) 
           / (double) frames); 
       g.copyArea(0, i, w1, 1, (int) d, 0); 
       if (borderGap) { 
        g.setColor(color); 
        g.drawLine((int) d, i, 0, i); 
        g.drawLine((int) d + w1, i, w1, i); 
       } 
      } 



    public void shearY(Graphics g, int w1, int h1, Color color) { 

      int period = generator.nextInt(40) + 10; // 50; 

      boolean borderGap = true; 
      int frames = 20; 
      int phase = 7; 
      for (int i = 0; i < w1; i++) { 
       double d = (double) (period >> 1) 
         * Math.sin((double) i / (double) period 
           + (6.2831853071795862D * (double) phase) 
           / (double) frames); 
       g.copyArea(i, 0, 1, h1, 0, (int) d); 
       if (borderGap) { 
        g.setColor(color); 
        g.drawLine(i, (int) d, i, 0); 
        g.drawLine(i, (int) d + h1, i, h1); 
       } 

      } 



    private void drawThickLine(Graphics g, int x1, int y1, int x2, int y2, 
       int thickness, Color c) { 

      // The thick line is in fact a filled polygon 
      g.setColor(c); 
      int dX = x2 - x1; 
      int dY = y2 - y1; 
      // line length 
      double lineLength = Math.sqrt(dX * dX + dY * dY); 

      double scale = (double) (thickness) / (2 * lineLength); 

      // The x and y increments from an endpoint needed to create a 
      // rectangle... 
      double ddx = -scale * (double) dY; 
      double ddy = scale * (double) dX; 
      ddx += (ddx > 0) ? 0.5 : -0.5; 
      ddy += (ddy > 0) ? 0.5 : -0.5; 
      int dx = (int) ddx; 
      int dy = (int) ddy; 

      // Now we can compute the corner points... 
      int xPoints[] = new int[4]; 
      int yPoints[] = new int[4]; 

      xPoints[0] = x1 + dx; 
      yPoints[0] = y1 + dy; 
      xPoints[1] = x1 - dx; 
      yPoints[1] = y1 - dy; 
      xPoints[2] = x2 - dx; 
      yPoints[2] = y2 - dy; 
      xPoints[3] = x2 + dx; 
      yPoints[3] = y2 + dy; 

      g.fillPolygon(xPoints, yPoints, 4); 


      本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發布,不代表本站觀點。請注意甄別內容中的聯系方式、誘導購買等信息,謹防詐騙。如發現有害或侵權內容,請點擊一鍵舉報。
      轉藏 分享 獻花(0

      0條評論

      發表

      請遵守用戶 評論公約

      類似文章 更多

      主站蜘蛛池模板: 小嫩批日出水无码视频免费| 香蕉EEWW99国产精选免费| 久久精品国产福利一区二区| 久久亚洲精品中文字幕波多野结衣| 免费无码成人AV在线播放不卡| 3d无码纯肉动漫在线观看| 夜鲁鲁鲁夜夜综合视频| 国产精品美女久久久久| 亚洲偷自拍国综合| 无翼乌工口肉肉无遮挡无码18 | 中文字幕无码日韩专区免费| 亚洲日本欧洲二区精品| 国产成人综合欧美精品久久| 国产国产午夜福利视频| 国产午夜无码视频在线观看| 免费无码一区无码东京热| 亚洲AV无码久久久久网站蜜桃| 国产一区二区不卡91| 国产成人AV三级在线观看按摩| 美女爽到高潮嗷嗷嗷叫免费网站| 国产喷水1区2区3区咪咪爱AV| 日韩丝袜欧美人妻制服| 婷婷综合久久狠狠色成人网| 亚洲A综合一区二区三区| AV激情亚洲男人的天堂| 99RE6在线观看国产精品| 久久精品国产亚洲av麻豆软件| A级毛片免费完整视频| 亚洲欧美日韩在线码| 亚洲一区二区观看播放| 成年女人喷潮免费视频| 国产不卡一区二区在线| 国产69精品久久久久999小说| 亚洲色大成永久WW网站| A毛片终身免费观看网站| 欧美黑人又粗又大高潮喷水 | 久久6久久66热这里只是精品| 天天做日日做天天添天天欢公交车 | 亚洲高清WWW色好看美女| 推油少妇久久99久久99久久| 偷炮少妇宾馆半推半就激情|