生成图片(VerifyCode 类)|学习笔记

开发者学堂课程【JSP 快速入门生成图片(VerifyCode 类)】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/33/detail/717


生成图片(VerifyCode 类)


内容简介:


1) 动态生成图片的基本步骤

2) BufferedImage 的构造

3) 范例:动态生成图片

4) 动态生成图片的源码

5) 测试源码


动态生成图片的基本步骤

1. 创建图片缓冲区

2. 设置其宽高

3. 得到图片的绘制环境(得到画笔)

4. 保存起来


BufferedImage 的构造

BufferedImage(int width, int height, intimageType)

构造一个类型为预定义图像类型之一的 BufferedImage。


范例:动态生成图片

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);//填充矩形,从0,0点开始,宽70,高35,即整个图片,即为图片设置背景色

g.setColor(Color.RED);//把环境设置为红色

g.drawstring("Hello",2,35-2);//向图片上写入字符串,其中2,2表示x,y轴的坐标

ImageIo. write(bi, "JPEG", new FileOutputStream("F:/xxx.jpg"));

结果为:生成图片(VerifyCode 类)|学习笔记


动态生成图片的源码


package cn.itcast.image;

import java.awt.BasicStroke;

public class VerifyCode {

private int w= 70;

private int h=35;

private Random r = new Random();

//《"宋体","华文楷体","黑体","华文新魏","华文隶书","微软雅黑","楷体_GB2312");

private String[] fontNames ={"宋体","华文楷体","黑体","微软雅黑","楷体_GB2312"};

//可选字符

private String codes = "23456789abcdefghj kmnopqrstuvwxyzABCDEFGHJKMNPQRSTUVWXYZ";

//背景色

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 drawLine (BufferedImage image) {

int num = 3;//一共画3条

Graphics2D g2 = (Graphics2D)image.getGraphics();

for(int i = 0; i < num; i++) {//生成两个点的坐标,即4个值

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);//画线

}

}

//随机生成一个字符

private char randomChar(){

int index=r.nextInt(codes.length());

return codes.charAt(index);

}

//创建BufferedImage

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;

}

//调用这个方法得到验证码

public BufferedImage getImage () {

BufferedImageimage=createImage()://创建图片缓冲区

Graphics2D g2=(Graphics2D)image.getGraphics()://得到绘制环境

StringBuilder sb=new StringBuilder()://用来装载生成的验证码文本

// 向图片中画4个字符

for(int i=0;1<4;i++) {//循环四次,每次生成一个字符

String s=randomChar()+"";//随机生成一个字母

sb.append(s);//把字母添加到ab中

float x=1*1.0F*w/4;//设置当前字符的x轴坐标

g2.setFont(randomFont());//设置随机字体

g2.setColor(randomColor());//设置随机颜色

g2.drawString(s,x,h-5);//画图

}

this.text=sb.toString();//把生成的字符串赋给了this.text

drawLine(image)://添加干扰线

return image;

}//返回验证码图片上的文本

public String getText

return text;

//保存图片到指定的输出流

public static void output (BufferedImage image, OutputStream out)

throws IOException {

ImageIo.write(image, "JPEG", out);

}

}


测试源码

@Test

public void fun2() throws FileNotFoundException, IOException {

VerifyCode vc = new VerifyCode();

BufferedImage bi = vc.getImage();

VerifyCode.output(bi,new FileOutputStream("F:/xxx.jpg"));

System.out.println(vc.getText());

}



上一篇:【云吞铺子之专家来了】linux系统启停问题之如何解决因为分区丢失导致的系统启动失败问题


下一篇:SLS时序存储发布-助力打造Log/Metric联合解决方案