首页>代码>java随机生成图片验证码>/随机生成算术表达式验证码.java
package com.tarena.dang.util;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;

import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

public final class ImageUtil {
	//private static final String[] chars = { "0", "1", "2", "3", "4", "5", "6",
	//		"7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I", "东",
	//		"南", "西", "北", "中", "发", "白" };
	
	private static final String[] chars = { "0", "1", "2", "3", "4", "5", "6","7", "8", "9"};
	private static final String[] cals = {"+", "-", "*", "/", "%"};
	private static final int SIZE = 4;//显示字符个数
	private static final int NUM = 2;//显示字符中的数字个数
	private static final int NUM1 = 1;//显示字符中的运算符个数
	private static final int LINES = 20;//干扰线数量
	private static final int WIDTH = 160;//图片宽度
	private static final int HEIGHT = 40;//图片高度
	private static final int FONT_SIZE = 40;//字体大小
	
	public static Map<Integer,BufferedImage> createImage() {
		BufferedImage image = new BufferedImage(WIDTH, HEIGHT,
				BufferedImage.TYPE_INT_RGB);
		Graphics graphic = image.getGraphics();
		graphic.setColor(Color.LIGHT_GRAY);
		graphic.fillRect(0, 0, WIDTH, HEIGHT);
		Random ran = new Random();
		//记录字符中的数字
		int[] num = new int[NUM];
		int index = 0;
		//记录运算符号
		String[] cals1 = new String[NUM1];
		int index1 = 0;
		//画随机字符
		for(int i=1;i<SIZE;i++){
			//数字
			if(i%2==1) {
				int r = ran.nextInt(chars.length);
				graphic.setColor(getRandomColor());
				graphic.setFont(new Font(null,Font.BOLD+Font.ITALIC,FONT_SIZE));
				graphic.drawString(chars[r],(i-1)*WIDTH/SIZE , 7*HEIGHT/8);
				num[index++] = Integer.parseInt(chars[r]);
				
			} else {
				//画符号
				int r = ran.nextInt(cals.length);
				graphic.setColor(new Color(0,0,0));
				graphic.setFont(new Font(null,Font.BOLD+Font.ITALIC,FONT_SIZE));
				graphic.drawString(cals[r],(i-1)*WIDTH/SIZE , 7*HEIGHT/8);
				cals1[index1++] = cals[r];
			}
			if(i==SIZE-1) {
				graphic.setColor(new Color(0,0,0));
				graphic.setFont(new Font(null,Font.BOLD+Font.ITALIC,FONT_SIZE));
				graphic.drawString("=",i*WIDTH/SIZE , 7*HEIGHT/8);
			}
		}
		//计算字符运算结果
		int result = cal(num,cals1);
		
		//画干扰线
		for(int i=1;i<=LINES;i++){
			graphic.setColor(getRandomColor());
			graphic.drawLine(ran.nextInt(WIDTH), ran.nextInt(HEIGHT), ran.nextInt(WIDTH),ran.nextInt(HEIGHT));
		}
		
		Map<Integer,BufferedImage> map = new HashMap<Integer,BufferedImage>();
		//结果和图片成键值对
		map.put(result, image);
		return map;
	}
	
	private static int cal(int[] num, String[] cals1) {
		int result = 0;
		if("+".equals(cals1[0])) {
			result = num[0] + num[1];
		} else if("-".equals(cals1[0])) {
			result = num[0] - num[1];
		} else if("*".equals(cals1[0])) {
			result = num[0] * num[1];
		} else if("/".equals(cals1[0])) {
			result = num[0] / num[1];
		} else if("%".equals(cals1[0])) {
			result = num[0] % num[1];
		}
		return result;
	}

	public static InputStream change(BufferedImage image) throws Exception{
		//将image图片压缩成JPEG
		ByteArrayOutputStream bos = 
				new ByteArrayOutputStream();
		JPEGImageEncoder encode = 
			JPEGCodec.createJPEGEncoder(bos);
		encode.encode(image);
		//将bos中存储的JPEG格式图片字节取出
		byte[] bytes = bos.toByteArray();
		return new ByteArrayInputStream(bytes);
	}
	
	private static Color getRandomColor(){
		Random ran = new Random();
		Color color = new Color(ran.nextInt(256),ran.nextInt(256),ran.nextInt(256));
		return color;
	}
}
最近下载更多
blueskyroof  LV9 2019年11月26日
zhouyunfei  LV3 2019年5月17日
skystory  LV11 2019年4月27日
123123zxl  LV11 2018年6月25日
罗明飞  LV4 2018年6月22日
Fdaxiong  LV1 2018年6月10日
yxw0707  LV3 2018年5月21日
1335203  LV10 2018年2月28日
乞丐哥哥  LV23 2018年2月11日
vipsers森林  LV2 2017年12月5日
最近浏览更多
EFWAGGFAWGR 2023年10月19日
暂无贡献等级
3174233007 2022年12月19日
暂无贡献等级
double_AI  LV1 2022年11月12日
wwww11112222 2022年7月19日
暂无贡献等级
芮坎尚  LV1 2022年5月11日
Jeasonchan898  LV2 2022年4月26日
杨豫川  LV12 2022年4月19日
10816599 2021年9月15日
暂无贡献等级
zhaoxu123123  LV10 2021年9月9日
zzy94269664  LV11 2021年3月16日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友