生成图片彩色验证码(附带验证码旋转)


生成验证码图片一般返回InputStream类型,不管什么情况下都能使用,只需要将InputStream这个返回的值在写到文件里就能动态生成

代码如下:

  1. packagecom.yxfei.tool;
  2. importjava.awt.Color;
  3. importjava.awt.Font;
  4. importjava.awt.Graphics;
  5. importjava.awt.Graphics2D;
  6. importjava.awt.geom.AffineTransform;
  7. importjava.awt.image.BufferedImage;
  8. importjava.io.ByteArrayInputStream;
  9. importjava.io.ByteArrayOutputStream;
  10. importjava.io.InputStream;
  11. importjava.util.Random;
  12. importjavax.imageio.ImageIO;
  13. importjavax.imageio.stream.ImageOutputStream;
  14. importjavax.servlet.http.HttpServletRequest;
  15. publicclassVerifycode{
  16. staticRandomr=newRandom();
  17. publicstaticColorgetRandColor(intmin,intmax){
  18. if(min>255)
  19. min=255;
  20. if(max>255)
  21. max=255;
  22. intred=r.nextInt(max-min)+min;
  23. intgreen=r.nextInt(max-min)+min;
  24. intblue=r.nextInt(max-min)+min;
  25. returnnewColor(red,green,blue);
  26. }
  27. publicstaticInputStreamgetVerifycode(intwidth,intheight,HttpServletRequestrequest)throwsException{
  28. //TODOAuto-generatedmethodstub
  29. ByteArrayInputStreaminputStream=null;
  30. BufferedImageimage=newBufferedImage(width,height,
  31. BufferedImage.TYPE_INT_RGB);
  32. Graphicsg=image.getGraphics();
  33. Graphics2Dg2d=(Graphics2D)g;
  34. g.setColor(getRandColor(200,250));
  35. g.fillRect(0,0,width,height);
  36. g.setColor(getRandColor(180,200));
  37. g.drawRect(0,0,width-1,height-1);
  38. for(inti=0;i<200;i++){
  39. intx=r.nextInt(width-1);
  40. inty=r.nextInt(height-1);
  41. intx1=r.nextInt(width-10)+10;
  42. inty1=r.nextInt(height-4)+4;
  43. g.setColor(getRandColor(180,200));
  44. g.drawLine(x,y,x1,y1);
  45. }
  46. for(inti=0;i<300;i++)
  47. {
  48. intx=r.nextInt(width);
  49. inty=r.nextInt(height);
  50. g.setColor(getRandColor(150,180));
  51. g.drawRect(x,y,0,0);
  52. }
  53. StringsRand="",s="";
  54. intdigital=0;
  55. intitmp=0;
  56. for(inti=0;i<4;i++){
  57. switch(r.nextInt(4)){
  58. case0:
  59. case1:
  60. digital=r.nextInt(26)+65;
  61. s=String.valueOf((char)digital);
  62. break;
  63. case2:
  64. digital=r.nextInt(26)+97;
  65. s=String.valueOf((char)digital);
  66. break;
  67. default:s=String.valueOf(r.nextInt(9));
  68. }
  69. sRand+=s;
  70. FontmFont=newFont("Arial",Font.BOLD|Font.ITALIC,25);
  71. g.setFont(mFont);
  72. booleanb=r.nextBoolean();
  73. Stringa=b?"":"-";
  74. intsin=Integer.parseInt(a+r.nextInt(20));
  75. g.setColor(getRandColor(20,130));
  76. AffineTransformtr=newAffineTransform();
  77. tr.rotate(sin*3.14/180,15*i+6,b?5:(0));
  78. g2d.setTransform(tr);
  79. g.drawString(s,16*i+10,23);
  80. }
  81. System.out.println(sRand);
  82. request.getSession(true).setAttribute("verifycode",sRand);
  83. g.dispose();
  84. ByteArrayInputStreaminput=null;
  85. ByteArrayOutputStreamoutput=newByteArrayOutputStream();
  86. try{
  87. ImageOutputStreamimageOut=ImageIO
  88. .createImageOutputStream(output);
  89. ImageIO.write(image,"JPEG",imageOut);
  90. imageOut.close();
  91. inputStream=newByteArrayInputStream(output.toByteArray());
  92. }catch(Exceptione){
  93. System.out.println("验证码生成失败"+e.toString());
  94. }
  95. returninputStream;
  96. }
  97. }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值