标签:参考 缓冲区 blog ring 图片格式 class 数字 ext style
参考:https://www.cnblogs.com/bigroc/p/7496995.html
导入jar包:
链接:https://pan.baidu.com/s/1r91QawdMbMCOZ1YIQtWd3Q
提取码:l2id
复制这段内容后打开百度网盘手机App,操作更方便哦
CreateQRCodeServlet.java
1 package cn.xxx.web.servlet; 2 3 import com.swetake.util.Qrcode; 4 5 import javax.imageio.ImageIO; 6 import javax.servlet.ServletException; 7 import javax.servlet.annotation.WebServlet; 8 import javax.servlet.http.HttpServlet; 9 import javax.servlet.http.HttpServletRequest; 10 import javax.servlet.http.HttpServletResponse; 11 import java.awt.Color; 12 import java.awt.Graphics2D; 13 import java.awt.image.BufferedImage; 14 import java.io.File; 15 import java.io.IOException; 16 17 @WebServlet("/createQRCodeServlet") 18 public class CreateQRCodeServlet extends HttpServlet { 19 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 20 21 //服务器通知浏览器不要缓存 22 response.setHeader("pragma","no-cache"); 23 response.setHeader("cache-control","no-cache"); 24 response.setHeader("expires","0"); 25 26 // 获取会议号 27 String mid = request.getParameter("mid"); 28 29 //计算二维码图片的高宽比 30 // API文档规定计算图片宽高的方式 ,v是本次测试的版本号 31 int v = 6; 32 int width = 67 + 12 * (v - 1); 33 int height = 67 + 12 * (v - 1); 34 35 36 Qrcode x = new Qrcode(); 37 /** 38 * 纠错等级分为 39 * level L : 最大 7% 的错误能够被纠正; 40 * level M : 最大 15% 的错误能够被纠正; 41 * level Q : 最大 25% 的错误能够被纠正; 42 * level H : 最大 30% 的错误能够被纠正; 43 */ 44 x.setQrcodeErrorCorrect(‘L‘); 45 x.setQrcodeEncodeMode(‘B‘);//注意版本信息 N代表数字 、A代表 a-z,A-Z、B代表 其他) 46 x.setQrcodeVersion(v);//版本号 1-40 47 String qrData = mid;//内容信息(此处保存的是会议号) 48 49 byte[] d = qrData.getBytes("utf-8");//汉字转格式需要抛出异常 50 51 //缓冲区 52 BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR); 53 54 //绘图 55 Graphics2D gs = bufferedImage.createGraphics(); 56 57 gs.setBackground(Color.WHITE); 58 gs.setColor(Color.BLACK); 59 gs.clearRect(0, 0, width, height); 60 61 //偏移量 62 int pixoff = 2; 63 64 65 /** 66 * 1.注意for循环里面的i,j的顺序, 67 * s[j][i]二维数组的j,i的顺序要与这个方法中的 gs.fillRect(j*3+pixoff,i*3+pixoff, 3, 3); 68 * 顺序匹配,否则会出现解析图片是一串数字 69 * 2.注意此判断if (d.length > 0 && d.length < 120) 70 * 是否会引起字符串长度大于120导致生成代码不执行,二维码空白 71 * 根据自己的字符串大小来设置此配置 72 */ 73 if (d.length > 0 && d.length < 120) { 74 boolean[][] s = x.calQrcode(d); 75 76 for (int i = 0; i < s.length; i++) { 77 for (int j = 0; j < s.length; j++) { 78 if (s[j][i]) { 79 gs.fillRect(j * 3 + pixoff, i * 3 + pixoff, 3, 3); 80 } 81 } 82 } 83 } 84 gs.dispose(); 85 bufferedImage.flush(); 86 //设置图片格式,与输出的路径,输出到响应当中 87 ImageIO.write(bufferedImage, "png", response.getOutputStream()); 88 } 89 90 91 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 92 this.doPost(request, response); 93 } 94 }
qrcode.jsp
1 <%@ page contentType="text/html;charset=UTF-8" language="java" %> 2 <html> 3 <head> 4 <title>我的会议号</title> 5 <style> 6 div{ 7 text-align: center; 8 margin-top: 220px; 9 } 10 </style> 11 </head> 12 <body> 13 <div> 14 <h2>请扫描此二维码查看您的会议号:</h2> 15 <br/> 16 <img src="${pageContext.request.contextPath}/createQRCodeServlet?mid=${mid}"/> 17 </div> 18 </body> 19 </html>
网页上的效果:
标签:参考 缓冲区 blog ring 图片格式 class 数字 ext style
原文地址:https://www.cnblogs.com/FengZeng666/p/11732200.html