文章來自我的部落格
正文之前
之前做過一個練手的Web專案登陸介面,其中有一個驗證碼模組,涉及到JavaIO和Java AWT工具所以打算寫一篇介紹,順便對練手專案的原始碼做一點小變動
正文
1. 變數
首先先定義幾個需要的變數
private int width=50; //圖片緩衝區的寬
private int height=15; //圖片緩衝區的高
private Random random=new Random(); //隨機數字
private Color color=new Color(255,255,255); //白色背景
private String text; //圖片上的文字
複製程式碼
2. 隨機字元、顏色
隨機字元包括了10位數字和26個字母
//生成隨機字元
private char randomChar()
{
//選取隨機數字,生成字元
String numbers = "1234567890qwertyuiopasdfghjklzxcvbnm";
int index=random.nextInt(numbers.length());
//轉換為char型別
return numbers.charAt(index);
}
//生成隨機顏色
private Color randomColor()
{
//以RGB形式表示顏色
int red=random.nextInt(255);
int green=random.nextInt(255);
int blue=random.nextInt(255);
//返回隨機生成的顏色
return new Color(red,green,blue);
}
複製程式碼
3. 干擾線
//畫干擾線
private void drawLine(Graphics g){
for (int i = 0; i < 2; i++) {
//設定線的顏色
g.setColor(randomColor());
//線的長度從(x1,y1)到(x2,y2)
g.drawLine(random.nextInt(width), random.nextInt(height),
random.nextInt(width), random.nextInt(height));
}
}
複製程式碼
4. 驗證碼中的文字
//返回驗證碼圖片中的文字
public String getText()
{
return text;
}
複製程式碼
5. 圖片緩衝區
//創造圖片緩衝區
private BufferedImage createImage()
{
//引數為寬度,高度和影像型別
BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
Graphics g=image.getGraphics();
//設定顏色
g.setColor(color);
//填充內容
g.fillRect(0,0,width,height);
return image;
}
複製程式碼
//得到圖片緩衝區
public BufferedImage getImage()
{
BufferedImage image = createImage(); //建立緩衝區
Graphics g = image.getGraphics(); //得到繪製環境
StringBuilder stringBuilder = new StringBuilder(); //驗證碼文字
//驗證碼長度為4
for (int i=0;i<4;i++)
{
String str = String.valueOf(randomChar()); //產生隨機字元,將char型別轉為String型別
stringBuilder.append(str); //將生成的隨機字元新增至stringBuilder
g.setColor(randomColor()); //產生隨機顏色
g.drawString(str, i * width / 4, height); //繪製文字
}
drawLine(g); //新增干擾線
text = stringBuilder.toString(); //把生成字串賦給文字,以便於驗證
return image;
}
複製程式碼
6. 輸出圖片
//使用輸出流列印圖片
public static void output(BufferedImage image, OutputStream out) throws IOException {
//作為JPEG格式輸出圖片
ImageIO.write(image,"JPG",out);
}
複製程式碼
Demo
直接輸出圖片到我的桌面
執行之後的結果:
就這樣,簡單的驗證碼就做完了