当前位置: 首页 > news >正文

关于图片的验证码

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

package photo;

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.Random;

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


public class ImageCodeAction  {
 private InputStream input;

 private static int WIDTH = 300;

 private static int HEIGHT = 100;

 private static int NUM = 4;

 private static char[] seq = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I',
   'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V',
   'W', 'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8',
   '9' };

 public String execute() {
  byte[] image = randomImage();
  input = new ByteArrayInputStream(image);
  return "success";
 }

 /**
  *
  * @return
  */
 private byte[] randomImage() {
  Random r = new Random();

  // 图片的内存映像
  BufferedImage image = new BufferedImage(WIDTH, HEIGHT,
    BufferedImage.TYPE_INT_RGB);

  // 获得画笔对象
  Graphics g = image.getGraphics();
  g.setColor(randomColor(r));
  g.fillRect(0, 0, WIDTH, HEIGHT);
  g.setColor(new Color(0, 0, 0));

  // 用于存储随机生成的验证码
  StringBuffer number = new StringBuffer();

  // 绘制验证码
  for (int i = 0; i < NUM; i++) {
   g.setColor(randomColor(r));
   int h = (int) ((HEIGHT * 60 / 100) * r.nextDouble() + (HEIGHT * 30 / 100));
   g.setFont(new Font(null, Font.BOLD | Font.ITALIC, h));
   String ch = String.valueOf(seq[r.nextInt(seq.length)]);
   number.append(ch);
   g.drawString(ch, i * WIDTH / NUM * 90 / 100, h);
  }

  session.put("code", number.toString());
  System.out.println(number.toString());

  // 绘制干扰线
  for (int i = 0; i <= 12; i++) {
   g.setColor(randomColor(r));
   g.drawLine(r.nextInt(WIDTH), r.nextInt(HEIGHT), r.nextInt(WIDTH), r
     .nextInt(HEIGHT));

  }

  ByteArrayOutputStream os = new ByteArrayOutputStream();

  JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(os);

  // 把BufferedImage对象中的图像信息编码后
  // 向创建该对象(encoder)时指定的输出流输出
  try {
   encoder.encode(image);
   return os.toByteArray();
  } catch (Exception e) {
   throw new RuntimeException(e);
  }
 }

 private Color randomColor(Random r) {
  return new Color(r.nextInt(255), r.nextInt(255), r.nextInt(255));
 }

 public InputStream getInput() {
  return input;
 }

 public void setInput(InputStream input) {
  this.input = input;
 }

}

转载于:https://my.oschina.net/lovetan/blog/38605

相关文章:

  • 玫瑰的红色
  • RHCS集群 切换时defunct僵尸进程解决方案
  • 深入研究mysql中group by与order by取分类最新时间内容——同理在android里也可用
  • 点击切换背景色,离开隐藏当前背景色显示默认背景
  • 学校报道并代本人年度总结
  • vim及bash配置
  • ProxmoxVe虚拟机双网卡设置
  • Linux内核vmlinuz文件认识
  • Intent中常量的意义
  • 如何判断touch到子视图或离开视图
  • Facebook经济体
  • DWR入门学习
  • IP地址与网络上的其他系统有冲突的解决办法:
  • sql server 2000 修改某列的类型
  • pku 3694 Network tarjan求割边
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • 07.Android之多媒体问题
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • hadoop集群管理系统搭建规划说明
  • Lucene解析 - 基本概念
  • node学习系列之简单文件上传
  • Python学习笔记 字符串拼接
  • React系列之 Redux 架构模式
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 微信开放平台全网发布【失败】的几点排查方法
  • gunicorn工作原理
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • 昨天1024程序员节,我故意写了个死循环~
  • ​力扣解法汇总1802. 有界数组中指定下标处的最大值
  • (1)常见O(n^2)排序算法解析
  • (java)关于Thread的挂起和恢复
  • (SpringBoot)第二章:Spring创建和使用
  • (超简单)使用vuepress搭建自己的博客并部署到github pages上
  • (独孤九剑)--文件系统
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (简单) HDU 2612 Find a way,BFS。
  • (三十五)大数据实战——Superset可视化平台搭建
  • (转)Google的Objective-C编码规范
  • (转)原始图像数据和PDF中的图像数据
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • *p++,*(p++),*++p,(*p)++区别?
  • .net framework4与其client profile版本的区别
  • .NET6使用MiniExcel根据数据源横向导出头部标题及数据
  • /3GB和/USERVA开关
  • @Transactional 详解
  • [ 常用工具篇 ] POC-bomber 漏洞检测工具安装及使用详解
  • [4.9福建四校联考]
  • [Android]RecyclerView添加HeaderView出现宽度问题
  • [fsevents@^2.1.2] optional install error: Package require os(darwin) not compatible with your platfo
  • [HJ56 完全数计算]
  • [javaSE] 看知乎学习工厂模式
  • [LeeCode]—Wildcard Matching 通配符匹配问题
  • [leetcode] 103. 二叉树的锯齿形层次遍历
  • [Linux](16)网络编程:网络概述,网络基本原理,套接字,UDP,TCP,并发服务器编程,守护(精灵)进程
  • [MySQL]SQL优化之索引的使用规则