图片验证码
package cn.itcast.image; 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; import org.junit.Test; public class Demo { @Test public void fun1(){ /* * 1创建图片缓冲区 * 2、设置宽高. * 3、得到这个图片的绘制环境(得到画笔) * 4、保存起来 */ BufferedImage bi=new BufferedImage(70, 35, BufferedImage.TYPE_INT_RGB); Graphics2D g=(Graphics2D) bi.getGraphics();//得到绘制环境 g.setColor(Color.WHITE);//设置笔的颜色 g.fillRect(0, 0, 70, 35);//填充矩形(左上角坐标,宽高) 这里就是使用上一步的绘制环境填充了矩形,也就是背景 g.setColor(Color.RED);//设置笔的颜色 g.drawString("Hello", 2, 35-2);//图片上写入字符串,其中2,2是表示xy轴的坐标 try { ImageIO.write(bi, "JPEG", new FileOutputStream("D://xxx.jpg")); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } @Test public void fun2() throws FileNotFoundException{ VerifyCode vc=new VerifyCode(); BufferedImage bi=vc.getImage(); VerifyCode.output(bi, new FileOutputStream("D://xxx1.jpg")); System.out.println(vc.getText()); } }
package cn.itcast.image; 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="23456789abdcefghjkmnopqrstuvwxyzABCDEFGHJKMNPQRSTUVWXYZ"; 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); } public char randomChar(){ return codes.charAt(r.nextInt(codes.length())); } 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;//生成随机字号 return new Font(fontName,style,size); } private void drawLine(BufferedImage image){ int num=3;//一共画三条线 Graphics2D g2=(Graphics2D)image.getGraphics(); for(int i=0;i<num;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 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.setText(sb.toString()); drawLine(image); return image; } private void setText(String text) { this.text=text; } public BufferedImage createImage(){ BufferedImage bi=new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB); Graphics2D g2=(Graphics2D)bi.getGraphics(); g2.setColor(bgColor); g2.fillRect(0, 0, w, h); return bi; } public String getText() { return text; } public static void output(BufferedImage image,OutputStream out){ try { ImageIO.write(image, "JPEG", out); } catch (IOException e) { e.printStackTrace(); } } }