import
java.awt.BasicStroke;
import
java.awt.Color;
import
java.awt.Font;
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
VerifyCode {
//图片宽高
private
int
w=
70
;
private
int
h=
35
;
private
Random r=
new
Random();
private
String[] fontNames={
"宋体"
,
"华文楷体"
,
"黑体"
,
"微软雅黑"
,
"楷体_GB2312"
};
private
String codes=
"234567890qwertyuipasdfghjkzxcvbnmQWERTYUIPASDFGHJKZXCVBNM"
;
private
Color bgColor=
new
Color(
255
,
255
,
255
);
private
String text;
//生成随机颜色
private
Color randomColor(){
int
red=r.nextInt(
150
);
int
green=r.nextInt(
150
);
int
blue=r.nextInt(
150
);
return
new
Color(red, green, blue);
}
//生成随机字体
private
Font randomFont(){
int
index=r.nextInt(fontNames.length);
String fontName=fontNames[index];
int
style=r.nextInt(
4
);
//0 无 1 粗体 2 斜体 3 粗+斜
int
size=r.nextInt(
5
)+
24
;
//生成随机字号 24~28
return
new
Font(fontName, style, size);
}
//干扰线
private
void
drowLine(BufferedImage image){
//生成4条干扰线
int
num=
4
;
Graphics2D bi=(Graphics2D) image.getGraphics();
for
(
int
i =
0
; i < num; i++) {
int
x1=r.nextInt(w);
int
x2=r.nextInt(w);
int
y1=r.nextInt(h);
int
y2=r.nextInt(h);
bi.setStroke(
new
BasicStroke(
1
.5F));
bi.setColor(Color.BLUE);
//干扰线色
bi.drawLine(x1,y1,x2,y2);
}
}
//随机生成一个字符
private
char
randomChar(){
int
index=r.nextInt(codes.length());
return
codes.charAt(index);
}
//图片缓冲区
private
BufferedImage createImage(){
BufferedImage image=
new
BufferedImage(w, h, BufferedImage.TYPE_INT_BGR);
Graphics2D bi=(Graphics2D) image.getGraphics();
bi.setColor(
this
.bgColor);
bi.fillRect(
0
,
0
, w, h);
return
image;
}
//生成图片
public
BufferedImage getImage(){
BufferedImage image=createImage();
Graphics2D bi=(Graphics2D) image.getGraphics();
StringBuilder sb=
new
StringBuilder();
for
(
int
i =
0
; i <
4
; i++) {
String string=randomChar()+
""
;
sb.append(string);
//每个字符占图片1/4宽
float
x=i*
1
.0F*w/
4
;
//随机字体格式
bi.setFont(randomFont());
bi.setColor(randomColor());
//把字写在图片适当处(h-6指图片距底部6个高度)
bi.drawString(string, x, h-
6
);
}
this
.text=sb.toString();
drowLine(image);
return
image;
}
//返回得到的字体
public
String getText(){
return
text;
}
//把图片写入指定位置
public
static
void
output(BufferedImage image,OutputStream out){
try
{
ImageIO.write(image,
"JPG"
, out);
}
catch
(IOException e) {
e.printStackTrace();
}
}
}
|
转自:http://www.jb51.net/article/100251.htm