package cn.lw.checking;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/*
* 創建圖片
*/
public class ServletDemo extends HttpServlet{
public void doGet(HttpServletRequest res,HttpServletResponse req){
//創建一張內存中的圖片,
BufferedImage bi = new BufferedImage(70, 35, BufferedImage.TYPE_INT_RGB);
//獲取當前圖片畫筆
Graphics g = bi.getGraphics();
//設置圖片背景色
g.setColor(new Color(240,240,240));
//填充圖片
g.fillRect(0, 0, 70,35);
//設置顏色
g.setColor(Color.RED);
//干擾線
g.drawLine(5, 5, 70-5, 35-5);
//設置字體
g.setFont(new Font("華文行楷", Font.BOLD, 26));
//寫入數據
g.drawString("hello",0,30);
//保存圖片
try {
ImageIO.write(bi, "JEG", req.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
}
}
}
package cn.lw.checking;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ServletDemo1 extends HttpServlet {
public void doGet(HttpServletRequest res,HttpServletResponse rep){
VCode vc = new VCode();
BufferedImage img = vc.getImage();
System.out.println(vc.getCode());
try {
VCode.saveImage(img, rep.getOutputStream());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
package cn.lw.checking;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;
import javax.imageio.ImageIO;
/*
* 設置圖片.隨機生成,驗證碼
*/
public class VCode {
private int w = 70;// 寬
private int h = 35;// 高
private Color bgColor = new Color(240, 240, 240); // 背景色
private Random random = new Random(); // 隨機數
private StringBuffer code = new StringBuffer(4);// 存放4個字符
/*
* 1.創建圖片 2.創建背景色
*/
private BufferedImage createImage() {
// 創建圖片
BufferedImage img = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
// 設置筆畫顏色
img.getGraphics().setColor(bgColor);
// 重填一個與圖形一樣大小的矩形,設置背景色.
img.getGraphics().fillRect(0, 0, w, h);
return img;
}
/*
* 生成隨機顏色
*/
private Color randomColor() {
int r = random.nextInt(256);
int g = random.nextInt(256);
int b = random.nextInt(256);
return new Color(r, g, b);
}
/*
* 字體名,樣式,字號.
*/
// 字體
private String[] fontName = { "宋體", "華文楷體", "黑體", "華文新魏", "華文隸書", "微軟雅黑",
"楷體_GB2312" };
// 字號規範
private int[] fontSize = { 24, 25, 26, 27, 28 };
/*
* 隨機生成字體
*/
private Font randomFont() {
// 如果數組長度爲7,數值爲0~6;
int index = random.nextInt(fontName.length);
String name = fontName[index];
int style = random.nextInt(4);
index = random.nextInt(fontSize.length);
// 隨機生成fontSize下標
int size = fontSize[index];
return new Font(name, style, size);
}
// 生成大寫字母小寫字母A~Z 數字0~9;
private String codes = "abcdefghigklmnopqrstuvwxyzABCDEFGHILKLMNOPQRSTUVWXYZ0123456789";
// 隨機生成字符
private String randomChar() {
int index = random.nextInt(codes.length());
return codes.charAt(index) + "";
}
private void drawLine(BufferedImage img) {
Graphics2D g = (Graphics2D) img.getGraphics();
g.setColor(Color.BLACK);
g.setStroke(new BasicStroke(1.5F));
for (int i = 0; i < 5; i++) {
int x1 = random.nextInt(w);
int y1 = random.nextInt(h);
int x2 = random.nextInt(w);
int y2 = random.nextInt(h);
g.drawLine(x1, y1, x2, y2);
}
}
// 用戶調用這個方法獲取圖片
public BufferedImage getImage() {
BufferedImage im = createImage();
Graphics g = im.getGraphics();
for (int i = 0; i < 4; i++) {
String ch = this.randomChar();// 獲取隨機字符
code.append(ch);// 記錄下來生成的字符
g.setColor(this.randomColor());// 隨機顏色
g.setFont(this.randomFont());// 隨機字體
g.drawString(ch, w / 4 * i, h - 5);
}
this.drawLine(im);// 添加干擾線
return im;
}
// 這個方法必須在getImage()方法之後調用!
public String getCode() {
return code.toString();
}
// 保存圖片
public static void saveImage(BufferedImage img, OutputStream out)
throws IOException {
ImageIO.write(img, "JPEG", out);
}
}
package cn.lw.junit;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.imageio.ImageIO;
import org.junit.Test;
import cn.lw.checking.VCode;
public class Text {
public void fun1() throws Exception, IOException{
//創建一張內存中的圖片
BufferedImage img = new BufferedImage(70,35,BufferedImage.TYPE_INT_RGB);
//獲取當前圖片的筆畫
Graphics g = img.getGraphics();
g.setColor(new Color(240,240,240));
g.fillRect(0, 0, 70, 35);
g.setColor(Color.RED);
g.drawLine(5, 5, 70-5, 35-5);
g.setFont(new Font("華文行楷", Font.BOLD, 26));
g.drawString("hello", 0, 30);
// 保存圖片
ImageIO.write(img, "JPEG", new FileOutputStream("F:\\a.jpg"));
}
@Test
public void fun2() throws FileNotFoundException, IOException {
VCode v = new VCode();
BufferedImage img = v.getImage();
VCode.saveImage(img, new FileOutputStream("F:\\a.jpg"));
}
}
jsp 部分
</head>
<body>
This is my JSP page. <br>
驗證碼:
<input type="text" name="vcode" size="3"/>
<img id=vc src="checking/ServletDemo1" border="2"/>
<a href="javascript:_chage()">看不清換一張</a>
<script type="text/javascript">
function _chage(){
var img = document.getElementById("vc");
img.src = "/checking/ServletDemo1?a=" + new Date().getTime();
}
</script>
<br/>
<input type="submit" value="提交"/>
</boday>