我想要生成如下图的图片,用java怎么生成啊,给定数字,格式固定!
解决方案 »
- 高人解答。。批量生成
- log4j的配置问题,为何后面生成的log日志会将前一天的记录给覆盖?
- Lucene+Struts2+Spring+IBatis实现文档内部搜索代码分享
- 求object数组操作方法~~!
- MyEclipse6.0中开发struts2.0
- 项目打包成一个EXE文件
- 为什么org.apache.commons.fileupload在webphere下不能上传doc文件,急!!!
- 在Weblogic中配置JDBC连接池,用sqlserver2000做数据库.可不可以直接把驱动文件考到哪个目录下面,不用添加在classpath里
- http://java.sun.com/j2ee/download.html#sdk 网站为什么上不了???
- 关于telnet
- SOAP压缩的问题
- 求解
public class VerifyCodeServlet extends HttpServlet { /**
*
*/
private static final long serialVersionUID = 1L; /**
* 验证码图片的宽度。
*/
private int width = 60; /**
* 验证码图片的高度。
*/
private int height = 20; /**
* 验证码字符个数
*/
private int codeCount = 4; /**
* xx
*/
private int xx = 0; /**
* 字体高度
*/
private int fontHeight; /**
* codeY
*/
private int codeY; /**
* codeSequence
*/
char[] codeSequence = { '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 void init() throws ServletException {
// 从web.xml中获取初始信息
// 宽度
String strWidth = this.getInitParameter("width");
// 高度
String strHeight = this.getInitParameter("height");
// 字符个数
String strCodeCount = this.getInitParameter("codeCount"); // 将配置的信息转换成数值
try {
if (strWidth != null && strWidth.length() != 0) {
width = Integer.parseInt(strWidth);
}
if (strHeight != null && strHeight.length() != 0) {
height = Integer.parseInt(strHeight);
}
if (strCodeCount != null && strCodeCount.length() != 0) {
codeCount = Integer.parseInt(strCodeCount);
}
} catch (NumberFormatException e) {
e.printStackTrace();
} xx = width / (codeCount + 1);
fontHeight = height - 2;
codeY = height - 4; }
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, java.io.IOException { // 定义图像buffer
BufferedImage buffImg = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
Graphics2D gd = buffImg.createGraphics(); // 创建一个随机数生成器类
Random random = new Random(); // 将图像填充为白色
gd.setColor(Color.WHITE);
gd.fillRect(0, 0, width, height); // 创建字体,字体的大小应该根据图片的高度来定。
Font font = new Font("Fixedsys", Font.PLAIN, fontHeight);
// 设置字体。
gd.setFont(font); // 画边框。
gd.setColor(Color.BLACK);
gd.drawRect(0, 0, width - 1, height - 1); // 随机产生160条干扰线,使图象中的认证码不易被其它程序探测到。
gd.setColor(Color.BLACK);
for (int i = 0; i < 160; i++) {
int x = random.nextInt(width);
int y = random.nextInt(height);
int xl = random.nextInt(12);
int yl = random.nextInt(12);
gd.drawLine(x, y, x + xl, y + yl);
} // randomCode用于保存随机产生的验证码,以便用户登录后进行验证。
StringBuffer randomCode = new StringBuffer();
int red = 0, green = 0, blue = 0; // 随机产生codeCount数字的验证码。
for (int i = 0; i < codeCount; i++) {
// 得到随机产生的验证码数字。
String strRand = String.valueOf(codeSequence[random.nextInt(36)]);
// 产生随机的颜色分量来构造颜色值,这样输出的每位数字的颜色值都将不同。
red = random.nextInt(255);
green = random.nextInt(255);
blue = random.nextInt(255); // 用随机产生的颜色将验证码绘制到图像中。
gd.setColor(new Color(red, green, blue));
gd.drawString(strRand, (i + 1) * xx, codeY); // 将产生的四个随机数组合在一起。
randomCode.append(strRand);
}
// 将四位数字的验证码保存到Session中。
HttpSession session = req.getSession();
session.setAttribute("validateCode", randomCode.toString()); // 禁止图像缓存。
resp.setHeader("Pragma", "no-cache");
resp.setHeader("Cache-Control", "no-cache");
resp.setDateHeader("Expires", 0); resp.setContentType("image/jpeg"); // 将图像输出到Servlet输出流中。
ServletOutputStream sos = resp.getOutputStream();
ImageIO.write(buffImg, "jpeg", sos);
sos.close();
}
}
产生结果servlet import java.io.IOException;
import java.io.PrintWriter;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;/**
* Package name : com.skcc.sample.action File name : ResultServlet.java Author :
* Administrator Date : 2008-9-4 Description : ResultServlet
*/
public class ResultServlet extends HttpServlet { /**
*
*/
private static final long serialVersionUID = 1L; /**
* The doGet method of the servlet. <br>
*
* This method is called when a form has its tag value method equals to get.
*
* @param request
* the request send by the client to the server
* @param response
* the response send by the server to the client
* @throws ServletException
* if an error occurred
* @throws IOException
* if an error occurred
*/
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { doPost(request, response);
} /**
* The doPost method of the servlet. <br>
*
* This method is called when a form has its tag value method equals to
* post.
*
* @param request
* the request send by the client to the server
* @param response
* the response send by the server to the client
* @throws ServletException
* if an error occurred
* @throws IOException
* if an error occurred
*/
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { response.setContentType("text/html;charset=utf-8");
String validateC = (String) request.getSession().getAttribute(
"validateCode");
String veryCode = request.getParameter("veryCode");
PrintWriter out = response.getWriter();
if (veryCode == null || "".equals(veryCode)) {
out.println("验证码为空");
} else {
if (validateC.equals(veryCode)) {
out.println("验证码正确");
} else {
out.println("验证码错误");
}
}
out.flush();
out.close();
}
}
import java.awt.Graphics2D;
import java.awt.font.FontRenderContext;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;import javax.imageio.ImageIO;/**
* 生成图片
*
*/
public class IdentifyUtil {
private int width = 60;
private int height = 20; public static void main(String[] args) {
IdentifyUtil util = new IdentifyUtil(146, 49);
util.createImage("d:/tmp/test.jpg", "3420");
} public IdentifyUtil(int width, int height) {
this.width = width > 0 ? width : this.width;
this.height = height > 0 ? height : this.height;
} /**
*
* @param randomString
*/
public void createImage(String path, String randomString) {
BufferedImage image = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
// 获取图形上下文
Graphics2D g = image.createGraphics();
// 设定背景色
g.setColor(new Color(223, 231, 242));
g.fillRect(0, 0, width, height);
// 设定字体
Font font = new Font("黑体", Font.BOLD, 40);
g.setFont(font);
FontRenderContext context = g.getFontRenderContext();
Rectangle2D bounds = font.getStringBounds(randomString, context);
double y = (height - bounds.getHeight()) / 2;
double ascent = -bounds.getY();
double baseY = y + ascent; char[] rondomChars = randomString.toCharArray();
for (int i = 0; i < rondomChars.length; i++) {
g.setColor(Color.RED);
g.drawChars(rondomChars, i, 1, 20 * i + 8, (int) baseY);
}
font = new Font("黑体", Font.BOLD, 25);
g.setFont(font);
g.drawChars("↑".toCharArray(), 0, 1, 85, (int) baseY);
rondomChars = "47".toCharArray();
for (int i = 0; i < rondomChars.length; i++) {
g.drawChars(rondomChars, i, 1, 12 * i + 106, (int) baseY);
}
// 图象生效
g.dispose();
File file = new File(path);
OutputStream os = null;
try {
os = new FileOutputStream(file);
ImageIO.write(image, "JPEG", os);
} catch (IOException e) {
System.out.println("系统信息:[at:IdentifyUtil],写入文件错误!");
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
os.flush();
os.close();
} catch (IOException e) {
System.out.println("系统信息:[at:IdentifyUtil],未能正确保存验证码图片文件!");
}
}
}
}