Java 生成验证码图片 示例

package com.service;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

import java.util.HashMap;
import java.util.Map;

import javax.annotation.Resource;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Service;

import com.dao.oracle.GraphicsCodeDao;
import com.secure.check.CheckParam;

@Service("cmd20101")
public class Cmd20101Service extends AbstractService {

    @Resource
    private CheckParam checkParam;
    
    @Resource
    private GraphicsCodeDao gCodeDao;
    
    @Override
    public Map<String, Object> doService(HttpServletRequest request) {
        logger.info("[20101] 获取图形验证码 : " + checkParam.getPostParams(request));
        Map<String,Object> data = new HashMap<String,Object>();
        data.put("result",  "1");
        data.put("data",null);
        try {
          String sCode = gCodeDao.getCode(request.getParameter("mobilephone"));
          if (sCode != null) {
              data.put("result",  "0");
              data.put("data", getGraphicsCode(sCode));
          }
        } catch (Exception e) {
            
            logger.error("[20101Error] 获取图形验证码 : " + e.getMessage());
        }
        return data;
    }
    
    @Override
    public Map<String, Object> doValid(HttpServletRequest request) {
        Map<String, String> validData = new HashMap<String, String>();
        validData.put("mobilephone",     "手机号码不能为空");
        return super.doValid(request, validData);
    }
    
    private String getGraphicsCode(String code) throws IOException {
        BufferedImage image = new BufferedImage(43, 18, BufferedImage.TYPE_INT_RGB);
        
        Graphics g = image.getGraphics();
        
        g.setColor(Color.yellow); // 设置背景色
        g.fillRect(1, 1, 41, 16);
        g.setColor(Color.black);  // 设置字体色
        // 输出数字
        for (int i = 0; i < 4; i ++ ) {
            char c = code.charAt(i);
            g.drawString(c + "", i * 7 + 8, 13);
        }
        
        BASE64Encoder base64 = new BASE64Encoder();
        
        ByteArrayOutputStream bs = new ByteArrayOutputStream();
        ImageIO.write(image, "jpg", bs);
        
        String result = base64.encodeBuffer(bs.toByteArray());
        
        bs.close();
        return result;
    }
    //base64字符串转化成图片  
    public static boolean GenerateImage(String imgStr)  
    {   //对字节数组字符串进行Base64解码并生成图片  
        if (imgStr == null) //图像数据为空  
            return false;  
        BASE64Decoder decoder = new BASE64Decoder();  
        try   
        {  
            //Base64解码  
            byte[] b = decoder.decodeBuffer(imgStr);  
            for(int i=0;i<b.length;++i)  
            {  
                if(b[i]<0)  
                {//调整异常数据  
                    b[i]+=256;  
                }  
            }  
            //生成jpeg图片  
            String imgFilePath = "d://444.jpg";//新生成的图片  
            OutputStream out = new FileOutputStream(imgFilePath);      
            out.write(b);  
            out.flush();  
            out.close();  
            return true;  
        }   
        catch (Exception e)   
        {  
            return false;  
        }  
    }
    public static void main(String[] args) {  
    int code = (int)(Math.random() * (9999 -1000)) + 1000; // 产生1000-9999之间的一个随机数
    System.out.println("code:" + code );
    
    String codes=String.valueOf(code);
    Cmd20101Service c=new Cmd20101Service();
    try {
        String a=c.getGraphicsCode(codes);
        System.out.println(a);
    

        c.GenerateImage(a);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    

}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值