10/10/2006

用java产生图片附加码,包含字体翻转功能

现在图片附加码功能已经被WEB应用广泛采纳以防范恶意的机器人攻击。
用java产生类似的附加码其实很简单,无非是产生一个jpeg图片并写上一些字母和数字,再加上一些混淆功能使得字不容易被自动识别即可。
下面的代码展示了如何产生一个图片附加码,并对文字进行翻转以避免被识别。
方法一:展示了如何产生一个图片
public BufferedImage drawImage(String code, float fontSize)
{
int size = code.length();
int width = (int) ((size + 1) * fontSize);
int height = (int) (fontSize * 1.67f);
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics2D g = (Graphics2D) image.getGraphics();
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

//填充矩形
g.setColor(Color.white);
g.fillRect(0, 0, width, height);
//绘制黑色边框
g.setColor(Color.gray);
g.drawRect(0, 0, width - 1, height - 1);

//绘制干扰线
g.setColor(Color.black);
char[] chars = new char[code.length()];
int unitWidth = (int) fontSize;
code.getChars(0, code.length(), chars, 0);
for (int i = 0; i < chars.length; i++) {
//为文字定位
int x = (int) (i * unitWidth + random(unitWidth * 4 / 15) + fontSize / 2);
int y = random(height / 3) + (int) fontSize;
//设置字体旋转,正负30度
AffineTransform at = AffineTransform.getRotateInstance(((random(60) - 30) * PI) / 180, x, y);
g.setTransform(at);
g.drawChars(chars, i, 1, x, y);
}
return image;
}

方法二:展示如何将其输出成图片文件
FileOutputStream fos = new FileOutputStream("code.jpg");
BufferedOutputStream bos = new BufferedOutputStream(fos);
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(fos);
encoder.encode(image);
bos.close();
方法三:使用Servlet输出到web页面
public class ImageServlet extends HttpServlet
{
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
response.setContentType("image/jpeg");
//图片自动超时
response.setHeader("Cache-Control", "no-store");
response.setDateHeader("Expires", 0);
ServletOutputStream out = response.getOutputStream();
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
encoder.encode(image);
out.close();
}
}

只需要使用方法一来替换二,三中的image即可实现功能,恕不能提供完整的代码,有任何问题欢迎留言或gtalk和我交流:D

No comments: