java验证码效果,和图片缩略效果
效果图:验证码
效果图:缩略
这两个效果我做在了一个类里面,可以进行调用,直接上代码
注:要是复制粘贴此代码,需要更改自己所使用的字体,也可以用我这个字体,记得更改字体路径
这个是写的方法:
package java_works_StringUtils;
import java.awt.*;
import java.io.*;
import java.util.*;
import java.awt.Color;
import java.awt.FontFormatException;
import java.awt.Graphics2D;
import java.awt.geom.GeneralPath;
import java.awt.geom.Path2D;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
public class StringUtils {
//随机字符串
public static String getStringFour(int length) {
StringBuilder s = new StringBuilder("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789");
StringBuilder str = new StringBuilder(length);
Random random = new Random();
for (int i = 0; i < length; i++) {
str.append(s.charAt(random.nextInt(s.length())));
}
return str.toString();
}
//输出四个字符,可更改
public String getString() {
return getStringFour(4);
}
/*随机输出验证码效果,中四个字母加数字*/
/*验证码效果生成*/
public static void verificationCode() {
StringUtils su = new StringUtils();
String str = su.getString();
Random random = new Random();
int width = 160;
int height = 60;
try {
BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);
Graphics2D g = bi.createGraphics();
g.setColor(Color.WHITE);
g.fillRect(0, 0, width, height);
java.awt.Font f = java.awt.Font.createFont(java.awt.Font.TRUETYPE_FONT,
new File("C:\\Users\\86182\\Desktop\\font\\c.ttf"));
//字体可以更换路径
java.awt.Font ff = f.deriveFont(java.awt.Font.BOLD, random.nextInt(10) + 40);
g.setFont(ff);
// 获取路径操作
Path2D path = new GeneralPath();
// 通过移动到指定的浮点精度指定的指定的坐标,向路径添加一个点。
path.moveTo(192, 18);
// 添加一个弯曲段,由两个新定义的点,通过绘制一条二次曲线相交的当前坐标和指定的坐标 (x2,y2)的路径,使用指定的点 (x1,y1)作为二次参考
path.quadTo(120, 12, 253, 67);
g.draw(path);
for (int i = 0; i < str.length(); i++) {
int x = i * 28 + random.nextInt(5) + 10;
int y = random.nextInt(10) + 30;
String text = String.valueOf(str.charAt(i));
g.setColor(new Color(random.nextInt(200), random.nextInt(200), random.nextInt(200)));
g.drawString(text, x, y);
}
// 干扰文字 可以选择加或者不加
String sss = su.getString();
for (int i = 0; i < str.length(); i++) {
int x = random.nextInt(width);
int y = random.nextInt(height);
String text = String.valueOf(sss.charAt(i));
g.setColor(new Color(random.nextInt(200), random.nextInt(200), random.nextInt(200),
random.nextInt(50) + 20));
g.drawString(text, x, y);
}
// 干扰曲线 可以选择加或者不加
g.setColor(new Color(random.nextInt(100), random.nextInt(100), random.nextInt(100),
random.nextInt(100) + 150));
g.setStroke(new BasicStroke(random.nextFloat() * 3f));
int yy = random.nextInt(20) + 20;// 控制线段起始位置y轴的水平高度
int hh = random.nextInt(10) + 5;// 控制线段弯曲波形幅度,为0时就是直线,数值越大波形幅度越陡峭
int aa = random.nextInt(30) + 30;// 控制线段波形的数量,如为30,图片中生成为30个距离一个波形;如果为60就是60距离一个波形
int len = random.nextInt(30);
for (int x = len; x <= width - len; x++) {
// for循环中的x控制线段起始位置,到达位置,和x为多少距离生成一个点的跨度
int y = (int) (yy + hh * Math.sin(x * Math.PI / aa));
g.drawLine(x, y, x, y);
}
g.dispose();
ImageIO.write(bi, "jpg",
new FileOutputStream("C:\\Users\\86182\\Desktop\\font\\" + UUID.randomUUID().toString() + ".jpg"));//随机
} catch (FontFormatException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/*
* 图片缩略功能
* int w 缩略图的宽度
* 缩略图高度不用设置,会自行根据原图比例进行大小调节
*
*/
public static void ImageUtils(String oldString,String newString,String format,int w) {
try {
int h=0;
BufferedImage bi=ImageIO.read(new File(oldString));//要缩略的图路径
int biw=bi.getWidth();
int bih=bi.getHeight();
h=(int)(1.0*w/biw*bih);//
BufferedImage newBi=new BufferedImage(w, h, BufferedImage.TYPE_3BYTE_BGR);//设置新图的比例
Graphics2D g=newBi.createGraphics();
g.drawImage(bi, 0, 0, w, h, null);
g.dispose();
ImageIO.write(newBi, "jpg", new FileOutputStream(""+newString+""+format));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
调用方法:
package java_works_StringUtils;
public class AA {
public static void main(String[] args) {
StringUtils.verificationCode();//随机验证码效果方法调用
StringUtils.ImageUtils("C:\\Users\\86182\\Desktop\\photo\\520.jpg", "C:\\Users\\86182\\Desktop\\520", ".jpg", 300);
//图片缩略效果方法调用 四个参数分别为:要缩略的图片地址,新的图片地址以及名字,图片的格式,和要缩略的图片宽度。
//输入宽度会自行调节高度,使的图片缩略后没有造成变形
}
}
选择字体的路径和输出保存的路径一定要更换,选择自己喜欢的字体格式,要不然会出现错误。随机四位字母和数字的方法自己也不是很满意,要是不喜欢可以自己写一个。可以直接使用这个验证码方法和图片缩略的方法,也可以作为一个参考自己写一下