java生成简单验证码图片

java生成简单验证码图片

					<div> 
														 小提莫来报到															
														 2024-10-10 03:17:24 

				</div>
									<pre> /**<br/>
  * 生成随机验证码<br/>
  * @param type  类型<br/>
  * @param length   长度<br/>
  * @param exChars  排除的字符<br/>
  * @return<br/>
  */<br/>
 public static String getRandomCode(int type,int length,String exChars){<br/>

      case TYPE_NUM_CHAR://数字+(大小写)字母

         while(i&lt;length){<br/>
             int t=random.nextInt(123);<br/>
             if((t&gt;=97||(t&gt;=65&amp;&amp;t&lt;=90)||(t&gt;=48&amp;&amp;t&lt;=57))&amp;&amp;(exChars==null||exChars.indexOf((char)t)&lt;0)){<br/>
                 sb.append((char)t);<br/>
                 i++;<br/>
             }<br/>
         }<br/>
         break;

     BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
    Graphics g = image.getGraphics();
    //随机操作对象
    Random r=new Random();
         g.setColor(backColor==null?getRandomColor():backColor);

     g.fillRect(0,0,width,height);</pre><pre>       if(interLine&gt;0){<br/>
         int x=r.nextInt(4),y=0;<br/>
         int x1=width-r.nextInt(4),y1=0;<br/>
         for(int i=0;i&lt;interLine;i++){<br/>
             g.setColor(lineColor==null?getRandomColor():lineColor);<br/>
             y=r.nextInt(height-r.nextInt(4));<br/>
             y1=r.nextInt(height-r.nextInt(4));<br/>
             g.drawLine(x,y,x1,y1);<br/>
         }<br/>
     }</pre><pre>      int fsize=(int)(height*0.8);//字体大小为图片高度的80%<br/>
     int fx=0;<br/>
     int fy=fsize;<br/>
     g.setFont(new Font(Font.SANS_SERIF,Font.PLAIN,fsize));<br/>
     //写字符<br/>
     for(int i=0;i&lt;textCode.length();i++){<br/>
         fy=randomLocation?(int)((Math.random()*0.3+0.6)*height):fy;//每个字符高低是否随机<br/>
         g.setColor(foreColor==null?getRandomColor():foreColor);<br/>
         g.drawString(textCode.charAt(i)+&#34;&#34;,fx,fy);<br/>
         fx+=(width / textCode.length()) * (Math.random() * 0.3 + 0.8); //依据宽度浮动<br/>
    }</pre><pre>      //扭曲图片<br/>
      shearX(g, width, height, backColor);<br/>
      shearY(g, width, height, backColor);<br/>
      private static void shearX(Graphics g, int w1, int h1, Color color) {<br/>
      Random random=new Random();<br/>
      int period = 2;

boolean borderGap = true;

      int frames = 1;<br/>
     int phase = random.nextInt(2);

for (int i = 0; i &lt; h1; i++) {

         double d = (double) (period &gt;&gt; 1)* Math.sin((double) i / (double) period<br/>

          + (2.2831853071795862D * (double) phase)/ (double) frames);

         g.copyArea(0, i, w1, 1, (int) d, 0);<br/>
         if (borderGap) {<br/>
             g.setColor(color);<br/>
             g.drawLine((int) d, i, 0, i);<br/>
             g.drawLine((int) d + w1, i, w1, i);<br/>
         }<br/>
     }

} private static void shearY(Graphics g, int w1, int h1, Color color) {

     Random random=new Random();<br/>
     int period = random.nextInt(40) + 10; // 50;

boolean borderGap = true;

     int frames = 20;<br/>
     int phase = random.nextInt(2);<br/>
     for (int i = 0; i &lt; w1; i++) {<br/>
         double d = (double) (period &gt;&gt; 1)<br/>
                 * Math.sin((double) i / (double) period<br/>
                         + (2.2831853071795862D * (double) phase)/ (double) frames);<br/>
         g.copyArea(i, 0, 1, h1, 0, (int) d);<br/>
         if (borderGap) {<br/>
             g.setColor(color);<br/>
             g.drawLine(i, (int) d, i, 0);<br/>
             g.drawLine(i, (int) d + h1, i, h1);<br/>
         }

} }

      float yawpRate = 0.05f;// 噪声率

     int area = (int) (yawpRate * width * height);//噪点数量<br/>
     for (int i = 0; i &lt; area; i++) {<br/>
         int xxx = r.nextInt(width);<br/>
         int yyy = r.nextInt(height);<br/>
         int rgb = getRandomColor().getRGB();<br/>
         image.setRGB(xxx, yyy, rgb);<br/>
     }</pre><pre>         g.dispose();<br/>
     return image;    </pre><pre> public static void main(String[] args) {<br/>
     String randomCode = CodeUtils.getRandomCode(CodeUtils.TYPE_NUM_CHAR, 4, null);<br/>
     System.out.println(randomCode);<br/>
     BufferedImage imageFromCode = ImageUtils.getImageFromCode(randomCode, 100, 50, 3, true, Color.WHITE, Color.BLACK, null);<br/>
      try {<br/>
         File file = new File(&#34;d:/test01.jpg&#34;);<br/>
         ImageIO.write(imageFromCode,&#34;jpg&#34;,file);<br/>
         System.out.println(&#34;成功保存到:&#34;+file.getAbsolutePath());<br/>
     } catch (IOException e) {<br/>
         System.out.println(&#34;保存失败&#34;);<br/>
         e.printStackTrace();<br/>
     } 

}

     public static void outputStream(HttpServletRequest request,HttpServletResponse response){

     try {<br/>
         // 设置浏览器不缓存本页<br/>
         response.addHeader(&#34;Pragma&#34;, &#34;no-cache&#34;);<br/>
         response.addHeader(&#34;Cache-Control&#34;, &#34;no-cache&#34;);<br/>
         response.addHeader(&#34;Expires&#34;, &#34;0&#34;);<br/>
         // 生成验证码,写入用户session<br/>
         String verifyCode = CodeUtils.getRandomCode(CodeUtils.TYPE_NUM_CHAR, 4, null);<br/>
         request.getSession().setAttribute(&#34;imageVerify&#34;, verifyCode);<br/>
         // 输出验证码给客户端<br/>
         response.setContentType(&#34;image/jpeg&#34;);<br/>
         BufferedImage bim = ImageUtils<br/>
                 .getImageFromCode(verifyCode, 47, 18, 3, true,<br/>
                         Color.WHITE, Color.BLACK, null);<br/>
         ImageIO.write(bim, &#34;JPEG&#34;, response.getOutputStream());

} catch (Exception e) {

     }<br/>
     return null;<br/>
 }</pre>


														<div>