java验证码效果,和图片缩略效果

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);
		//图片缩略效果方法调用 四个参数分别为:要缩略的图片地址,新的图片地址以及名字,图片的格式,和要缩略的图片宽度。
		//输入宽度会自行调节高度,使的图片缩略后没有造成变形
	}
}

选择字体的路径和输出保存的路径一定要更换,选择自己喜欢的字体格式,要不然会出现错误。随机四位字母和数字的方法自己也不是很满意,要是不喜欢可以自己写一个。可以直接使用这个验证码方法和图片缩略的方法,也可以作为一个参考自己写一下

猜你喜欢

转载自blog.csdn.net/qq_45844443/article/details/109403052
今日推荐