posts - 495,comments - 227,trackbacks - 0
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(3215825); 
  color[
1= new Color(2184219); 
  color[
2= new Color(3175208); 
  
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(
00, 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(nulltruefalse)); 
  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, 
01, 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); 





posted on 2009-09-01 14:43 SIMONE 阅读(1525) 评论(1)  编辑  收藏

FeedBack:
# re: java输出扭曲验证码
2010-08-31 23:57 | 游客
全是这样的  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: