Java生成验证码图片

 Java生成验证码图片


网络上存在的两种生成验证码的方法:
1. ImageIO.write();
 ImageIO.write(image4, "PNG", out);
 缺点:太慢,生成很小的图片,需要800-2000毫秒;
2. JPEGImageEncoder encoder.encode();
//        JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(response.getOutputStream());
//        JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(image4);
//        param.setQuality(1.0f, false);
//        encoder.setJPEGEncodeParam(param);
//        encoder.encode(image4);

或者

//        OutputStream outStream = response.getOutputStream();
//        JPEGImageEncoder encoder =JPEGCodec.createJPEGEncoder(outStream);
//        encoder.encode(image4);
//        outStream.close();

 缺点:很快,但属于Sun内部包,可能对于非Sun的JDK支持不一致;


其他方式:

1. jimi 
       try{
            com.sun.jimi.core.Jimi.putImage("image/jpeg", image4, out);
        }catch(Exception e){
            e.printStackTrace();
        }

 速度快,需要使用Sun提供的包,独立;

这个做法,比一般的IMageIO快10-60倍;推荐推荐;

2. jai
 由于目前jai为Sun社区工程;目前暂无下载;

3. Acme开发包
 ACME实现了GIF的生成等,但未实现JPEG的实现;不太完整;但对于GIF效率,略低于JIMI;

4. PhotoServlet
 网上搜索到的开源工程,主要是做Photo部分;
 但同时提供了ImageWriter类,并提供了相应JPEG处理;

 缺点:太慢;可以和ImageIO有的一拼;


最后决定:
 JIMI使用;

 

参考文章
JSP生成验证码:
http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=121&threadID=14022&start=0&tstart=0

JSP生成验证码:
http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=81&threadID=44288&tstart=0

验证码图片生成问题:
http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=121&threadID=25103


JIMI下载:
http://java.sun.com/products/jimi/

ACME下载:

Java操作图片大集合:
http://www.blogjava.net/security/archive/2006/05/23/java_image_library.html
JAI下载:


 

Java生成验证码图片对于初学者来说,通常会涉及一些图形库如Apache Commons ImageIO、Java2D或更现代的JavaFX。以下是基本步骤: 1. 导入必要的库:首先,你需要引入`java.awt.image.BufferedImage`,它提供了一个二维像素数组来创建图像;还有`java.awt.Color`用于设置颜色,`java.awt.Graphics2D`用于绘制。 ```java import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; ``` 2. 创建BufferedImage:指定宽度和高度,然后创建一个新的`BufferedImage`实例。 ```java int width = 100; // 验证码宽度 int height = 40; // 验证码高度 BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); ``` 3. 生成随机字符:选择一个包含数字和字母的字符串集合,随机生成验证码内容。 ```java String chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; StringBuilder sb = new StringBuilder(); for (int i = 0; i < 4; i++) { int randomIndex = (int) (Math.random() * chars.length()); sb.append(chars.charAt(randomIndex)); } String captchaText = sb.toString(); ``` 4. 绘制验证码:通过Graphics2D对象在图像上绘制字符和干扰线等元素。 ```java Graphics2D g2d = image.createGraphics(); g2d.setFont(new Font("Arial", Font.PLAIN, 24)); // 设置字体 Color background = Color.WHITE; g2d.setColor(background); g2d.fillRect(0, 0, width, height); // 填充背景 Color textColor = new Color(0, 0, 0); // 字符色 g2d.setColor(textColor); for (int i = 0; i < captchaText.length(); i++) { int x = i * 20 + 10; // 每个字符之间的间距 int y = 20; g2d.drawString(captchaText.charAt(i) + "", x, y); } // 添加干扰线等其他效果... ``` 5. 保存或显示图片:最后,可以将图像转换为PNG或其他格式并保存到文件,或者直接显示在窗口中(如果是JavaFX的话)。 ```java try { File outputFile = new File("captcha.png"); ImageIO.write(image, "png", outputFile); } catch (IOException e) { e.printStackTrace(); } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值