生成二維碼
核心工具類!!!!!
public class QRcodeUtil {
private static final Loggerlog = LoggerFactory.getLogger(QRcodeUtil.class);
? ? //CODE_WIDTH:二維碼寬度,單位像素
? ? private static final int CODE_WIDTH =400;
? ? //CODE_HEIGHT:二維碼高度陆错,單位像素
? ? private static final int CODE_HEIGHT =400;
? ? //FRONT_COLOR:二維碼前景色,0x000000 表示黑色
? ? private static final int FRONT_COLOR =0x000000;
? ? //BACKGROUND_COLOR:二維碼背景色,0xFFFFFF 表示白色
? ? //演示用 16 進(jìn)制表示立镶,和前端頁面 CSS 的取色是一樣的扎运,注意前后景顏色應(yīng)該對(duì)比明顯沼侣,如常見的黑白
? ? private static final int BACKGROUND_COLOR =0xFFFFFF;
? ? /** 創(chuàng)建內(nèi)容到二維碼,生成二維碼到本地赁项,二維碼圖片格式為png/jpg(png和jpg可以調(diào)換)
? ? * @param content
? ? * @param codeImgFileSaveDir
? ? * @param fileName
? ? * @return void
? ? * @date 2022/7/29 14:49
*/
? ? public static void createCodeToFile(String content, File codeImgFileSaveDir, String fileName) {
try {
if (!StringUtils.hasLength(content) || !StringUtils.hasLength(fileName)) {
return;
? ? ? ? ? ? }
content = content.trim();
? ? ? ? ? ? if (codeImgFileSaveDir ==null || codeImgFileSaveDir.isFile()) {
//二維碼圖片存在目錄為空,默認(rèn)放在桌面...
? ? ? ? ? ? ? ? codeImgFileSaveDir = FileSystemView.getFileSystemView().getHomeDirectory();
? ? ? ? ? ? }
if (!codeImgFileSaveDir.exists()) {
//二維碼圖片存在目錄不存在,開始創(chuàng)建...
? ? ? ? ? ? ? ? codeImgFileSaveDir.mkdirs();
? ? ? ? ? ? }
//核心代碼-生成二維碼
? ? ? ? ? ? BufferedImage bufferedImage =getBufferedImage(content);
? ? ? ? ? ? File codeImgFile =new File(codeImgFileSaveDir, fileName);
? ? ? ? ? ? ImageIO.write(bufferedImage, "png", codeImgFile);
? ? ? ? }catch (Exception e) {
e.printStackTrace();
? ? ? ? }
}
public static void main(String[] args) {
createCodeToFile("https://www.baidu.com",new File("D:/pic"),"123.png");
? ? }
/**
? ? * 生成二維碼并輸出到輸出流, 通常用于輸出到網(wǎng)頁上進(jìn)行顯示悠菜,輸出到網(wǎng)頁與輸出到磁盤上的文件中舰攒,區(qū)別在于最后一句 ImageIO.write
? ? * write(RenderedImage im,String formatName,File output):寫到文件中
? ? * write(RenderedImage im,String formatName,OutputStream output):輸出到輸出流中
? ? *
? ? * @param content? ? ? :二維碼內(nèi)容
? ? * @param outputStream :輸出流,比如 HttpServletResponse 的 getOutputStream
*/
? ? public static void createCodeToOutputStream(String content, OutputStream outputStream) {
try {
if (!StringUtils.hasLength(content)) {
return;
? ? ? ? ? ? }
content = content.trim();
? ? ? ? ? ? //核心代碼-生成二維碼
? ? ? ? ? ? BufferedImage bufferedImage =getBufferedImage(content);
? ? ? ? ? ? //區(qū)別就是這一句悔醋,輸出到輸出流中摩窃,如果第三個(gè)參數(shù)是 File,則輸出到文件中
? ? ? ? ? ? ImageIO.write(bufferedImage, "png", outputStream);
? ? ? ? ? ? log.info("二維碼圖片生成到輸出流成功...");
? ? ? ? }catch (Exception e) {
e.printStackTrace();
? ? ? ? }
}
//核心代碼-生成二維碼
? ? private static BufferedImagegetBufferedImage(String content)throws WriterException {
//com.google.zxing.EncodeHintType:編碼提示類型,枚舉類型
? ? ? ? Map hints =new HashMap();
? ? ? ? //EncodeHintType.CHARACTER_SET:設(shè)置字符編碼類型
? ? ? ? hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
? ? ? ? //EncodeHintType.ERROR_CORRECTION:設(shè)置誤差校正
? ? ? ? //ErrorCorrectionLevel:誤差校正等級(jí)芬骄,L = ~7% correction猾愿、M = ~15% correction、Q = ~25% correction账阻、H = ~30% correction
? ? ? ? //不設(shè)置時(shí)蒂秘,默認(rèn)為 L 等級(jí),等級(jí)不一樣宰僧,生成的圖案不同材彪,但掃描的結(jié)果是一樣的
? ? ? ? hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
? ? ? ? //EncodeHintType.MARGIN:設(shè)置二維碼邊距,單位像素琴儿,值越小段化,二維碼距離四周越近
? ? ? ? hints.put(EncodeHintType.MARGIN, 1);
? ? ? ? MultiFormatWriter multiFormatWriter =new MultiFormatWriter();
//? ? ? ? BarcodeFormat.QR_CODE是設(shè)置為二維碼格式,
? ? ? ? BitMatrix bitMatrix = multiFormatWriter.encode(content, BarcodeFormat.QR_CODE, CODE_WIDTH, CODE_HEIGHT, hints);
? ? ? ? BufferedImage bufferedImage =new BufferedImage(CODE_WIDTH, CODE_HEIGHT, BufferedImage.TYPE_INT_BGR);
? ? ? ? for (int x =0; x
for (int y =0; y
bufferedImage.setRGB(x, y, bitMatrix.get(x, y) ?FRONT_COLOR :BACKGROUND_COLOR);
? ? ? ? ? ? }
}
return bufferedImage;
? ? }
}
使用方法1
如果是要傳遞給前端
@RequestMapping("test")
public void test(HttpServletResponse response)throws IOException {
????ServletOutputStream outputStream = response.getOutputStream();
? ? //第一個(gè)是設(shè)置掃描后內(nèi)容造成,第二個(gè)是返回的outstream流
? ? QRcodeUtil.createCodeToOutputStream("https://www.baidu.com",outputStream);
}
使用方法2
如果是要生成照片到本地路徑显熏,直接調(diào)用
第一個(gè)參數(shù)設(shè)置掃描后內(nèi)容,第二個(gè)是路徑地址晒屎,第三個(gè)是生成的文件名
createCodeToFile("https://www.baidu.com",new File("D:/pic"),"123.png");