登錄注冊的時候都會有圖片驗證,這是為了防止暴力破解和惡意注冊。寫一個思路來實現驗證圖片的實現,只是一個思路,隨機生成文字並沒有寫。
import java.awt.Color; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import javax.imageio.ImageIO; public class Image { public static void main(String[] args) throws FileNotFoundException, IOException{ //得到圖片緩沖區 BufferedImage bi=new BufferedImage(150,70, BufferedImage.TYPE_INT_RGB); //得到畫筆 Graphics2D g2=(Graphics2D) bi.getGraphics(); //填充背景 g2.setColor(Color.WHITE); g2.fillRect(0, 0, 150, 70); //設置邊框 g2.setColor(Color.RED); g2.drawRect(0, 0, 149, 69); //向圖片上寫字符串
g2.setFont(new Font("宋體", Font.BOLD, 10));
g2.setColor(Color.BLACK); g2.drawString("grup", 19, 20); ImageIO.write(bi, "JPEG", new FileOutputStream("f:/g.jpg")); } }
可以做的文章有,第一是隨機生成字符,第二隨機生成顏色,第三隨機生成干擾線,第四隨機生成字體,第五隨機生成字號等等
網頁登錄的時候需要圖片驗證,今天剛好用到,把之前沒有做的東西補充上來。
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="23456789abcdefghigklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; //背景顏色 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); int size=r.nextInt(5)+24; return new Font(fontName, style, size); } //生成隨機字符 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_RGB); Graphics2D g2=(Graphics2D)image.getGraphics(); g2.setColor(this.bgColor); g2.fillRect(0, 0, w, h); return image; } //生成隨機亂線 private void drawLine(BufferedImage image){ int num=3; Graphics2D g2=(Graphics2D)image.getGraphics(); for(int i=0;i<3;i++){ int x1=r.nextInt(w); int y1=r.nextInt(h); int x2=r.nextInt(w); int y2=r.nextInt(h); g2.setStroke(new BasicStroke(1.5F)); g2.setColor(Color.BLUE); g2.drawLine(x1,y1,x2,y2); } } //將圖片輸出到某個輸出流中 public static void output(BufferedImage image,OutputStream out) throws IOException{ ImageIO.write(image, "JPEG",out); } //得到圖片上的文字 public String getText(){ return text; } //得到圖片 public BufferedImage getImage(){ BufferedImage image=createImage(); Graphics2D g2=(Graphics2D)image.getGraphics(); StringBuilder sb=new StringBuilder(); for(int i=0;i<4;i++){ String s=randomChar()+""; sb.append(s); float x=i*1.0F*w/4; g2.setFont(randomFont()); g2.setColor(randomColor()); g2.drawString(s, x, h-5); } this.text=sb.toString(); drawLine(image); return image; } }