如何生成图片,例如验证码是怎样产生的
发布网友
发布时间:2022-04-27 03:35
我来回答
共3个回答
懂视网
时间:2022-04-21 17:58
![](https://img.51dongshi.com/20210302/wz/91923552.jpg)
验证码图片生成步骤
- 创建BufferedImage对象。
- 获取BufferedImage的画笔,即调用getGraphics()方法获取Graphics对象。
- 调用Graphics对象的setColor()方法和fillRect()方法设置图片背景颜色。
- 调用Graphics对象的setColor()方法和drawLine()方法设置图片干扰线。
- 调用BufferedImaged对象的setRGB()方法设置图片的噪点。
- 调用Graphics对象的setColor()方法、setFont()方法和drawString()方法设置图片验证码。
因为验证码的图片的宽度和高度要根据网站的风格来确定的,所以字体的大小需要根据图片的宽度和高度来确定,用到了小小的技巧。
package util;import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.Image;import java.awt.image.BufferedImage;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.util.Random;import javax.imageio.ImageIO;public class Verification { private static final String ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890"; /** * 生成一个宽为width, 高为height, 验证码为code的图片 * @param width 图片的宽 * @param height 图片的高 * @param code 验证码字符串 * @return 返回图片验证码 */ public static BufferedImage getImage(int width, int height, String code){ return getImage(width, height, code, 20); } /** * 生成一个宽为width, 高为height, 验证码为code的图片,图片中干扰线的条数为lineCnt * @param width 图片的宽 * @param height 图片的高 * @param code 验证码字符串 * @param lineCnt 干扰线的条数,建议为10条左右,可根据结果适当调整 * @return 返回图片验证码 */ public static BufferedImage getImage(int width, int height, String code, int lineCnt){ return createImage(width, height, code, lineCnt, 0.01); } /** * 生成一个宽为width, 高为height, 验证码为code的图片,图片中干扰线的条数为lineCnt * 噪声比为noiseRate,即图片中噪音像素点的百分比 * @param width 图片的宽 * @param height 图片的高 * @param code 验证码字符串 * @param lineCnt 干扰线的条数,建议为10条左右,可根据结果适当调整 * @param noiseRate 图片中噪音像素点占总像素的百分比 * @return 返回图片验证码 */ public static BufferedImage getImage(int width, int height, String code, int lineCnt, double noiseRate){ return createImage(width, height, code, lineCnt, noiseRate); } /** * * 生成一个宽为width, 高为height, 验证码为code的图片,图片中干扰线的条数为lineCnt * 噪声比为noiseRate,即图片中噪音像素点的百分比 * @param width 图片的宽 * @param height 图片的高 * @param code 验证码字符串 * @param lineCnt 干扰线的条数,建议为10条左右,可根据结果适当调整 * @param noiseRate 图片中噪音像素点占总像素的百分比 * @return 返回图片验证码 */ private static BufferedImage createImage(int width, int height, String code, int lineCnt, double noiseRate){ int fontWidth = ((int)(width * 0.8)) / code.length(); int fontHeight = (int)(height * 0.7); //为了在任意的width和height下都能生成良好的验证码, //字体的大小为fontWdith何fontHeight中的小者, int fontSize = Math.min(fontWidth, fontHeight); //drawString时要用到 int paddingX = (int) (width * 0.1); int paddingY = height - (height - fontSize) / 2; //创建图像 BufferedImage buffimg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); //获得画笔 Graphics g = buffimg.getGraphics(); //设置画笔的颜色 g.setColor(getRandColor(200, 255)); //然后填充一个矩形,即设置背景色 g.fillRect(0, 0, width, height); // 设置干扰线 for (int i = 0; i < lineCnt; i++) { //随机获取干扰线的起点和终点 int xs = (int)(Math.random() * width); int ys = (int)(Math.random() * height); int xe = (int)(Math.random() * width); int ye = (int)(Math.random() * height); g.setColor(getRandColor(1, 255)); g.drawLine(xs, ys, xe, ye); } // 添加噪点 int area = (int) (noiseRate * width * height); for(int i=0; i 255) L = 255; if(R > 255) R = 255; if(L < 0) L = 0; if(R < 0) R = 0; int interval = R - L; int r = L + (int)(Math.random() * interval); int g = L + (int)(Math.random() * interval); int b = L + (int)(Math.random() * interval); return new Color(r, g, b); } /** * 随机生成若干个由大小写字母和数字组成的字符串 * @param len 随机生成len个字符 * @return 返回随机生成的若干个由大小写字母和数字组成的字符串 */ public static String getRandCode(int len){ String code = ""; for(int i=0; i
使用验证码图片
在verificationCode.java这个servlet中调用上面的类生成验证码图片,然后将图片返回给客户端。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession(); //随机生成字符串,并写入session String code = Verification.getRandCode(4); session.setAttribute("verification", code); BufferedImage image = util.Verification.getImage(100,30, code, 5); response.setContentType("image/png"); OutputStream out = response.getOutputStream(); out.write(util.Verification.getByteArray(image)); out.flush(); out.close(); }
在index.jsp中设置验证码,用户点击验证码时,调用js代码请求服务器得到新的验证码。因为上面的那个生成验证码的servlet会被浏览器缓存,所以js代码中需要给该servlet一个随机的参数,这样浏览器就会向服务器发请求得到新的验证码,而不是去缓存中读取。
<%@page import="util.Verification"%><%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>Insert title here
最后是在checkVerification.java这个servlet中判断用户输入的验证码是否正确,为了方便用户,验证码一般都设置成大小写不敏感,所以要先转化为小写字母再比对。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession(); String verification = (String)session.getAttribute("verification"); String submitVerification = request.getParameter("submitVerification"); PrintWriter out = response.getWriter(); if(verification!=null && submitVerification!=null){ if(verification.toLowerCase().equals(submitVerification.toLowerCase())){ out.println("yes!!!"); } else{ out.println("no!!!"); } } else{ out.println("no!!!"); } session.removeAttribute("verification");//防止用户重复提交表单 } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); }
最后运行的效果图如下
该文章在我的个人博客地址是: http://www.alphaway.org/post-464.html
热心网友
时间:2022-04-21 15:06
给你一个我实际运用的JAVA图形验证码类.packagenbsp;iclass.image;/**nbsp;*nbsp;amp;lt;pamp;gt;Title:nbsp;*图形显示数字后,把数字保存在SESSION中,SESSION的名字为GET过来的名字(sessionName=名字).当没有名字时nbsp;*nbsp;名为默认为randamp;lt;/pamp;gt;nbsp;*nbsp;amp;lt;pamp;gt;Description:nbsp;amp;lt;/pamp;gt;nbsp;*nbsp;web.xml中增加.nbsp;nbsp;amp;lt;servletamp;gt;nbsp;nbsp;nbsp;nbsp;amp;lt;servlet-nameamp;gt;randCodeImageamp;lt;/servlet-nameamp;gt;nbsp;nbsp;nbsp;nbsp;amp;lt;servlet-classamp;gt;iclass.image.RandCodeImageamp;lt;/servlet-classamp;gt;nbsp;nbsp;amp;lt;/servletamp;gt;nbsp;nbsp;amp;lt;servlet-mappingamp;gt;nbsp;nbsp;nbsp;nbsp;amp;lt;servlet-nameamp;gt;randCodeImageamp;lt;/servlet-nameamp;gt;nbsp;nbsp;nbsp;nbsp;amp;lt;url-patternamp;gt;/randCodeImageamp;lt;/url-patternamp;gt;nbsp;nbsp;amp;lt;/servlet-mappingamp;gt;nbsp;*nbsp;amp;lt;pamp;gt;Copyright:nbsp;Copyrightnbsp;(c)nbsp;2004amp;lt;/pamp;gt;nbsp;*nbsp;*nbsp;amp;lt;pamp;gt;Company:nbsp;amp;lt;/pamp;gt;nbsp;*nbsp;*nbsp;@authornbsp;段洪杰nbsp;*nbsp;@versionnbsp;1.0nbsp;*/importnbsp;javax.imageio.ImageIO;importnbsp;javax.servlet.ServletException;importnbsp;javax.servlet.http.HttpServlet;importnbsp;javax.servlet.http.HttpServletRequest;importnbsp;javax.servlet.http.HttpServletResponse;importnbsp;java.awt.*;importnbsp;java.awt.image.BufferedImage;importnbsp;java.io.IOException;importnbsp;java.util.Random;/**nbsp;*nbsp;描述:nbsp;*nbsp;*nbsp;@authornbsp;$author$nbsp;*nbsp;@versionnbsp;$Revision:nbsp;1.1nbsp;$nbsp;*/publicnbsp;classnbsp;RandCodeImagenbsp;extendsnbsp;HttpServletnbsp;{nbsp;nbsp;nbsp;nbsp;privatenbsp;Fontnbsp;mFontnbsp;=nbsp;newnbsp;Font(“Arialnbsp;Black“,nbsp;Font.PLAIN,nbsp;15);nbsp;//设置字体nbsp;nbsp;nbsp;nbsp;privatenbsp;intnbsp;lineWidthnbsp;=nbsp;2;nbsp;//干扰线的长度=1.414*lineWidthnbsp;nbsp;nbsp;nbsp;privatenbsp;intnbsp;widthnbsp;=nbsp;60;nbsp;//定义图形大小nbsp;nbsp;nbsp;nbsp;privatenbsp;intnbsp;heightnbsp;=nbsp;20;nbsp;//定义图形大小nbsp;nbsp;nbsp;nbsp;privatenbsp;intnbsp;countnbsp;=nbsp;200;nbsp;nbsp;nbsp;nbsp;/**nbsp;nbsp;nbsp;nbsp;nbsp;*nbsp;描述:nbsp;nbsp;nbsp;nbsp;nbsp;*nbsp;nbsp;nbsp;nbsp;nbsp;*nbsp;@paramnbsp;fcnbsp;描述:nbsp;nbsp;nbsp;nbsp;nbsp;*nbsp;@paramnbsp;bcnbsp;描述:nbsp;nbsp;nbsp;nbsp;nbsp;*nbsp;nbsp;nbsp;nbsp;nbsp;*nbsp;@returnnbsp;描述:nbsp;nbsp;nbsp;nbsp;nbsp;*/nbsp;nbsp;nbsp;nbsp;privatenbsp;Colornbsp;getRandColor(intnbsp;fc,nbsp;intnbsp;bc)nbsp;{nbsp;//取得给定范围随机颜色nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;HttpServletRequestnbsp;request;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;Randomnbsp;randomnbsp;=nbsp;newnbsp;Random();nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;ifnbsp;(fcnbsp;amp;gt;nbsp;255)nbsp;{nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;fcnbsp;=nbsp;255;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;}nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;ifnbsp;(bcnbsp;amp;gt;nbsp;255)nbsp;{nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;bcnbsp;=nbsp;255;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;}nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;intnbsp;rnbsp;=nbsp;fcnbsp;+nbsp;random.nextInt(bcnbsp;-nbsp;fc);nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;intnbsp;gnbsp;=nbsp;fcnbsp;+nbsp;random.nextInt(bcnbsp;-nbsp;fc);
热心网友
时间:2022-04-21 16:24
给你一个我实际运用的JAVA图形验证码类.packagenbsp;iclass.image;/**nbsp;*nbsp;amp;lt;pamp;gt;Title:nbsp;*图形显示数字后,把数字保存在SESSION中,SESSION的名字为GET过来的名字(sessionName=名字).当没有名字时nbsp;*nbsp;名为默认为randamp;lt;/pamp;gt;nbsp;*nbsp;amp;lt;pamp;gt;Description:nbsp;amp;lt;/pamp;gt;nbsp;*nbsp;web.xml中增加.nbsp;nbsp;amp;lt;servletamp;gt;nbsp;nbsp;nbsp;nbsp;amp;lt;servlet-nameamp;gt;randCodeImageamp;lt;/servlet-nameamp;gt;nbsp;nbsp;nbsp;nbsp;amp;lt;servlet-classamp;gt;iclass.image.RandCodeImageamp;lt;/servlet-classamp;gt;nbsp;nbsp;amp;lt;/servletamp;gt;nbsp;nbsp;amp;lt;servlet-mappingamp;gt;nbsp;nbsp;nbsp;nbsp;amp;lt;servlet-nameamp;gt;randCodeImageamp;lt;/servlet-nameamp;gt;nbsp;nbsp;nbsp;nbsp;amp;lt;url-patternamp;gt;/randCodeImageamp;lt;/url-patternamp;gt;nbsp;nbsp;amp;lt;/servlet-mappingamp;gt;nbsp;*nbsp;amp;lt;pamp;gt;Copyright:nbsp;Copyrightnbsp;(c)nbsp;2004amp;lt;/pamp;gt;nbsp;*nbsp;*nbsp;amp;lt;pamp;gt;Company:nbsp;amp;lt;/pamp;gt;nbsp;*nbsp;*nbsp;@authornbsp;段洪杰nbsp;*nbsp;@versionnbsp;1.0nbsp;*/importnbsp;javax.imageio.ImageIO;importnbsp;javax.servlet.ServletException;importnbsp;javax.servlet.http.HttpServlet;importnbsp;javax.servlet.http.HttpServletRequest;importnbsp;javax.servlet.http.HttpServletResponse;importnbsp;java.awt.*;importnbsp;java.awt.image.BufferedImage;importnbsp;java.io.IOException;importnbsp;java.util.Random;/**nbsp;*nbsp;描述:nbsp;*nbsp;*nbsp;@authornbsp;$author$nbsp;*nbsp;@versionnbsp;$Revision:nbsp;1.1nbsp;$nbsp;*/publicnbsp;classnbsp;RandCodeImagenbsp;extendsnbsp;HttpServletnbsp;{nbsp;nbsp;nbsp;nbsp;privatenbsp;Fontnbsp;mFontnbsp;=nbsp;newnbsp;Font(“Arialnbsp;Black“,nbsp;Font.PLAIN,nbsp;15);nbsp;//设置字体nbsp;nbsp;nbsp;nbsp;privatenbsp;intnbsp;lineWidthnbsp;=nbsp;2;nbsp;//干扰线的长度=1.414*lineWidthnbsp;nbsp;nbsp;nbsp;privatenbsp;intnbsp;widthnbsp;=nbsp;60;nbsp;//定义图形大小nbsp;nbsp;nbsp;nbsp;privatenbsp;intnbsp;heightnbsp;=nbsp;20;nbsp;//定义图形大小nbsp;nbsp;nbsp;nbsp;privatenbsp;intnbsp;countnbsp;=nbsp;200;nbsp;nbsp;nbsp;nbsp;/**nbsp;nbsp;nbsp;nbsp;nbsp;*nbsp;描述:nbsp;nbsp;nbsp;nbsp;nbsp;*nbsp;nbsp;nbsp;nbsp;nbsp;*nbsp;@paramnbsp;fcnbsp;描述:nbsp;nbsp;nbsp;nbsp;nbsp;*nbsp;@paramnbsp;bcnbsp;描述:nbsp;nbsp;nbsp;nbsp;nbsp;*nbsp;nbsp;nbsp;nbsp;nbsp;*nbsp;@returnnbsp;描述:nbsp;nbsp;nbsp;nbsp;nbsp;*/nbsp;nbsp;nbsp;nbsp;privatenbsp;Colornbsp;getRandColor(intnbsp;fc,nbsp;intnbsp;bc)nbsp;{nbsp;//取得给定范围随机颜色nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;HttpServletRequestnbsp;request;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;Randomnbsp;randomnbsp;=nbsp;newnbsp;Random();nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;ifnbsp;(fcnbsp;amp;gt;nbsp;255)nbsp;{nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;fcnbsp;=nbsp;255;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;}nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;ifnbsp;(bcnbsp;amp;gt;nbsp;255)nbsp;{nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;bcnbsp;=nbsp;255;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;}nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;intnbsp;rnbsp;=nbsp;fcnbsp;+nbsp;random.nextInt(bcnbsp;-nbsp;fc);nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;intnbsp;gnbsp;=nbsp;fcnbsp;+nbsp;random.nextInt(bcnbsp;-nbsp;fc); 查看原帖>>
手机验证码图片如何制作?
1. 验证图片的呈现方式:通常,在进行滑动图片验证时,屏幕上会出现一个带有切口的图片,用户需要按照指示将图片滑动到正确的位置。例如,切口可能是一个缺口或一个突出部分,用户需要将图片滑动以使其完整或与背景图像匹配。2. 滑动操作的方式:用户需要用手指在屏幕上滑动来完成验证。这个滑动操作通常是...
二维码防伪标签怎么制作?
二维码防伪标签的制作涉及多个步骤。首先,设计防伪元素,如独特的图案和文字,确保难以仿制。接着,选择可信赖的二维码生成工具,为每个标签生成标识码。随后,将防伪元素嵌入二维码图案中,并选择合适材料进行印刷。印刷完成后,对标签进行质检,确保符合设计要求。最后,将防伪标签粘贴到产品包装上,并建立溯源系统,以便监控产品的真伪验证。整个制作过程注重标签的性、防伪性和可追溯性。服务热线:18201196057(微信同号)信飞智创防伪溯源公司位于中国北京,专业研发一物一码窜货系统、防伪标签、二维码营销、导购促销、追溯产品、溯源领域的企业级管理SAAS平台。信飞智创采用电子商务营销,减少传统营销成本,与企业直接合作减少...
图形验证码怎么弄
另外一种方法是使用图形处理软件如Photoshop或者GIMP来手动创建验证码。这种方法需要更多的时间和努力,但可以生成非常独特和复杂的验证码。例如,你可以创建一个包含多个图层和效果的验证码,其中每个图层都包含不同的文本、形状或颜色。然后,你可以使用软件的变形和滤镜功能来添加噪声和扭曲效果,以增加验证...
网页验证码的实现原理有哪些?
网页验证码的实现原理有很多种,其中最常见的是图片验证码。图片验证码的原理是:1. 生成图片验证码;2. 用户输入界面上的图片验证码;3. 进行服务端校验。除了图片验证码,还有其他类型的验证码,例如滑动验证、短信验证等。这些验证码的实现原理各不相同,但它们都是为了保护网站或应用程序的安全而设计...
验证码是什么?
验证码的工作原理通常是通过生成一段难以被自动化程序识别和理解的随机字符或图案,并要求用户在执行特定操作前手动输入或选择这些字符或图案。这样,只有具备人类识别能力的用户才能完成验证,而自动化脚本或机器人则因为无法准确识别和理解这些字符或图案而无法通过验证。验证码的种类繁多,常见的有字符验证码...
如何生成一个100%有效的验证码?
随机生成是验证码的核心步骤。利用随机数生成器,创建一个随机的字符串,作为你的验证码示例。生成的验证码应当是独一无二的,每个用户请求时都会得到不同的验证码。验证验证码的有效性是必不可少的环节。你需要确保生成的验证码能够准确无误地被系统识别和使用,避免因错误识别导致用户体验下降或安全漏洞...
验证码是什么?
验证码的实现方式有很多种。最常见的是字符验证码,它会在用户界面上显示一串随机生成的字符,并要求用户准确输入这些字符以完成验证。例如,很多网站在注册或登录时都会要求用户输入验证码以确保账户安全。除了字符验证码外,还有图片验证码和滑块验证码等多种类型。图片验证码通常显示一张包含文字或图形的...
验证码是什么东西
1. 字符验证码:系统生成一串随机字符或数字,要求用户按照显示的顺序或位置输入这些字符或数字。2. 图片验证码:系统生成一张包含随机字符或图案的图片,并要求用户识别并输入图片中的字符或选择相应的图案。3. 滑动验证码:用户需要通过滑动滑块或点击按钮等方式,将滑块或按钮拖动到正确的位置或完成一...
怎样做手机验证码
怎样做手机验证码:第一部分:组织验证内容 也就是生成动态验证码,可以用手机号+当前时间戳做个加密运算之类的,得出一个4-6位的验证码 当然这个时候还没完,要把手机号和这个验证码同时存储到数据库中(如果是临时验证的话,存储到Session中也是可以的);第二部分:发送短信 这部分就是将刚才组织好...
如何生成图片,例如验证码是怎样产生的求大神帮助
给你一个我实际运用的JAVA图形验证码类.packagenbsp;iclass.image;/**nbsp;*nbsp;amp;lt;pamp;gt;Title:nbsp;*图形显示数字后,把数字保存在SESSION中,SESSION的名字为GET过来的名字(sessionName=名字).当没有名字时nbsp;*nbsp;名为默认为randamp;lt;/pamp;gt;nbsp;*nbsp;amp;lt;pamp;gt;...
如何通过滑动拼图验证码
要通过这类验证码,首先需要仔细观察验证界面。一般来说,验证码图片会有一个明显的空缺,这是拼图碎片应当放置的位置。碎片的形状和图案会与图片的其它部分相匹配,因此,用户需要识别出碎片与空缺之间的关联。例如,如果空缺处是一个蛋糕的缺口,那么拼图碎片可能就是蛋糕被切除的那一小块。在识别出碎片...