java生成简单验证码图片
- 作者: 五速梦信息网
- 时间: 2026年04月04日 13:36
java生成简单验证码图片
<div>
小提莫来报到
2024-10-10 03:17:24
</div>
<pre> /**<br/>
* 生成随机验证码<br/>
* @param type 类型<br/>
* @param length 长度<br/>
* @param exChars 排除的字符<br/>
* @return<br/>
*/<br/>
public static String getRandomCode(int type,int length,String exChars){<br/>
case TYPE_NUM_CHAR://数字+(大小写)字母
while(i<length){<br/>
int t=random.nextInt(123);<br/>
if((t>=97||(t>=65&&t<=90)||(t>=48&&t<=57))&&(exChars==null||exChars.indexOf((char)t)<0)){<br/>
sb.append((char)t);<br/>
i++;<br/>
}<br/>
}<br/>
break;
}
BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
Graphics g = image.getGraphics();
//随机操作对象
Random r=new Random();
g.setColor(backColor==null?getRandomColor():backColor);
g.fillRect(0,0,width,height);</pre><pre> if(interLine>0){<br/> int x=r.nextInt(4),y=0;<br/> int x1=width-r.nextInt(4),y1=0;<br/> for(int i=0;i<interLine;i++){<br/> g.setColor(lineColor==null?getRandomColor():lineColor);<br/> y=r.nextInt(height-r.nextInt(4));<br/> y1=r.nextInt(height-r.nextInt(4));<br/> g.drawLine(x,y,x1,y1);<br/> }<br/> }</pre><pre> int fsize=(int)(height*0.8);//字体大小为图片高度的80%<br/> int fx=0;<br/> int fy=fsize;<br/> g.setFont(new Font(Font.SANS_SERIF,Font.PLAIN,fsize));<br/> //写字符<br/> for(int i=0;i<textCode.length();i++){<br/> fy=randomLocation?(int)((Math.random()*0.3+0.6)*height):fy;//每个字符高低是否随机<br/> g.setColor(foreColor==null?getRandomColor():foreColor);<br/> g.drawString(textCode.charAt(i)+"",fx,fy);<br/> fx+=(width / textCode.length()) * (Math.random() * 0.3 + 0.8); //依据宽度浮动<br/> }</pre><pre> //扭曲图片<br/> shearX(g, width, height, backColor);<br/> shearY(g, width, height, backColor);<br/> private static void shearX(Graphics g, int w1, int h1, Color color) {<br/> Random random=new Random();<br/> int period = 2;boolean borderGap = true;
int frames = 1;<br/> int phase = random.nextInt(2);for (int i = 0; i < h1; i++) {
double d = (double) (period >> 1)* Math.sin((double) i / (double) period<br/>+ (2.2831853071795862D * (double) phase)/ (double) frames);
g.copyArea(0, i, w1, 1, (int) d, 0);<br/> if (borderGap) {<br/> g.setColor(color);<br/> g.drawLine((int) d, i, 0, i);<br/> g.drawLine((int) d + w1, i, w1, i);<br/> }<br/> }} private static void shearY(Graphics g, int w1, int h1, Color color) {
Random random=new Random();<br/> int period = random.nextInt(40) + 10; // 50;boolean borderGap = true;
int frames = 20;<br/> int phase = random.nextInt(2);<br/> for (int i = 0; i < w1; i++) {<br/> double d = (double) (period >> 1)<br/> * Math.sin((double) i / (double) period<br/> + (2.2831853071795862D * (double) phase)/ (double) frames);<br/> g.copyArea(i, 0, 1, h1, 0, (int) d);<br/> if (borderGap) {<br/> g.setColor(color);<br/> g.drawLine(i, (int) d, i, 0);<br/> g.drawLine(i, (int) d + h1, i, h1);<br/> }} }
float yawpRate = 0.05f;// 噪声率
int area = (int) (yawpRate * width * height);//噪点数量<br/> for (int i = 0; i < area; i++) {<br/> int xxx = r.nextInt(width);<br/> int yyy = r.nextInt(height);<br/> int rgb = getRandomColor().getRGB();<br/> image.setRGB(xxx, yyy, rgb);<br/> }</pre><pre> g.dispose();<br/> return image; </pre><pre> public static void main(String[] args) {<br/> String randomCode = CodeUtils.getRandomCode(CodeUtils.TYPE_NUM_CHAR, 4, null);<br/> System.out.println(randomCode);<br/> BufferedImage imageFromCode = ImageUtils.getImageFromCode(randomCode, 100, 50, 3, true, Color.WHITE, Color.BLACK, null);<br/> try {<br/> File file = new File("d:/test01.jpg");<br/> ImageIO.write(imageFromCode,"jpg",file);<br/> System.out.println("成功保存到:"+file.getAbsolutePath());<br/> } catch (IOException e) {<br/> System.out.println("保存失败");<br/> e.printStackTrace();<br/> }}
public static void outputStream(HttpServletRequest request,HttpServletResponse response){
try {<br/>
// 设置浏览器不缓存本页<br/>
response.addHeader("Pragma", "no-cache");<br/>
response.addHeader("Cache-Control", "no-cache");<br/>
response.addHeader("Expires", "0");<br/>
// 生成验证码,写入用户session<br/>
String verifyCode = CodeUtils.getRandomCode(CodeUtils.TYPE_NUM_CHAR, 4, null);<br/>
request.getSession().setAttribute("imageVerify", verifyCode);<br/>
// 输出验证码给客户端<br/>
response.setContentType("image/jpeg");<br/>
BufferedImage bim = ImageUtils<br/>
.getImageFromCode(verifyCode, 47, 18, 3, true,<br/>
Color.WHITE, Color.BLACK, null);<br/>
ImageIO.write(bim, "JPEG", response.getOutputStream());
} catch (Exception e) {
}<br/>
return null;<br/>
}</pre>
<div>






