package com.powernode.qrcode.servlet;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
@WebServlet("/generate")
public class GenerateQrCode extends HttpServlet
{
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
// 获取文本内容
String url = request.getParameter("url");
try{
// 使用谷歌提供的ZXING
// 需要创建一个Map集合存储二维码相关的属性
Map map = new HashMap();
// 设置二维码的误差校正级别
// 可选值如下L(7%),M(15%),Q(25%),H(30%)
// 容错率越高消耗资源越多
map.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
// 设置二维码的字符集
map.put(EncodeHintType.CHARACTER_SET,"UTF-8");
// 设置二维码的四周留白
map.put(EncodeHintType.MARGIN,1);
// 创建ZXING核心对象
// 通过这个对象来生成二维码
MultiFormatWriter multiFormatWriter = new MultiFormatWriter();
// 需要的参数如下,内容,什么格式的二维码,二维码宽度,二维码高度,二维码参数
// BarcodeFormat翻译为条形码格式,通过这个对象来设置格式
// 如QrCode二维码,具有数据密度高可靠性强的特点
// AztecCode高密度可靠性强低容错率更小的尺寸,更高的效率(常用于个人信息账号信息,个人密码)
// PDF417是一种储存大量信息的二维码格式(用于航空机票,运输配送,法律文件等)
// DataMatrix是一种小巧的二维码格式,编码方式类似于QrCode二维码,但是可靠性识别率扫描速度都更优秀,尺寸小,可靠性高,因此多用于嵌入简单的产品标签
// 医疗图像监测数据等方面
BitMatrix bitMatrix = multiFormatWriter.encode(url, BarcodeFormat.QR_CODE, 300, 300, map);
// 返回一个位矩阵对象(对象内部其实是一个二维数组,二维数组中每一个元素是Boolean类型,true代表黑色,false代表白色)
// 获取矩阵的宽度
int width = bitMatrix.getWidth();
// 获取矩阵的高度
int height = bitMatrix.getHeight();
// 生成二维码图片
// 这个对象是awt.image包下的专门用来生成图片的缓冲对象
BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
// 编写一个嵌套循环,遍历二维数组的循环,遍历这个位矩阵对象
for (int x = 0; x < width; x++) {
// 按这个矩阵的高度和宽度遍历一遍
for (int y = 0; y < height; y++) {
// 0xFF000000是黑色,0xFFFFFFFF是白色
image.setRGB(x,y,bitMatrix.get(x,y) ? 0xFF000000 : 0xFFFFFFFF);
}
}
// 将图片响应回到客户端
ServletOutputStream outputStream = response.getOutputStream();
ImageIO.write(image,"PNG",outputStream);
// 用完这个流要关闭这个流
outputStream.flush();
outputStream.close();
}
catch(Exception e){
e.printStackTrace();
}
}
}
package com.powernode.qrcode.servlet;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
@WebServlet("/generate")
public class GenerateQrCode extends HttpServlet
{
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
// 获取文本内容
String url = request.getParameter("url");
try{
// 使用谷歌提供的ZXING
// 需要创建一个Map集合存储二维码相关的属性
Map map = new HashMap();
// 设置二维码的误差校正级别
// 可选值如下L(7%),M(15%),Q(25%),H(30%)
// 容错率越高消耗资源越多
map.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
// 设置二维码的字符集
map.put(EncodeHintType.CHARACTER_SET,"UTF-8");
// 设置二维码的四周留白
map.put(EncodeHintType.MARGIN,1);
// 创建ZXING核心对象
// 通过这个对象来生成二维码
MultiFormatWriter multiFormatWriter = new MultiFormatWriter();
// 需要的参数如下,内容,什么格式的二维码,二维码宽度,二维码高度,二维码参数
// BarcodeFormat翻译为条形码格式,通过这个对象来设置格式
// 如QrCode二维码,具有数据密度高可靠性强的特点
// AztecCode高密度可靠性强低容错率更小的尺寸,更高的效率(常用于个人信息账号信息,个人密码)
// PDF417是一种储存大量信息的二维码格式(用于航空机票,运输配送,法律文件等)
// DataMatrix是一种小巧的二维码格式,编码方式类似于QrCode二维码,但是可靠性识别率扫描速度都更优秀,尺寸小,可靠性高,因此多用于嵌入简单的产品标签
// 医疗图像监测数据等方面
BitMatrix bitMatrix = multiFormatWriter.encode(url, BarcodeFormat.QR_CODE, 300, 300, map);
// 返回一个位矩阵对象(对象内部其实是一个二维数组,二维数组中每一个元素是Boolean类型,true代表黑色,false代表白色)
// 获取矩阵的宽度
int width = bitMatrix.getWidth();
// 获取矩阵的高度
int height = bitMatrix.getHeight();
// Generate QR code images
// This object is a buffer object under the awt.image package specially used to generate images.
BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
//Write a nested loop and traverse Loop of two-dimensional array, traverse this bit matrix object
for (int x = 0; x < width; x++) {
// Traverse once according to the height and width of this matrix
for (int y = 0; y < height; y++) {
// 0xFF000000 is black, 0xFFFFFFFF is white
image.setRGB(x,y,bitMatrix.get(x,y) ? 0xFF000000 : 0xFFFFFFFF);
}
}
// Return the image response to the client
ServletOutputStream outputStream = response.getOutputStream() ;
ImageIO.write(image,"PNG",outputStream);
//Close the stream when you are done with it
outputStream.flush();
outputStream.close();
}
catch(Exception e){
e.printStackTrace();
}
}
}