本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2024-11(1)

Java通过QRCode生成二维码

发布于2021-03-13 14:13     阅读(714)     评论(0)     点赞(27)     收藏(0)


一、前言

QR Code码,是由Denso公司于1994年9月研制的一种矩阵二维码符号,它具有一维条码及其它二维条码所具有的信息容量大、可靠性高、可表示汉字及图象多种文字信息、保密防伪性强等优点。

先下载QRCode.jar包:https://pan.baidu.com/s/1Pb9XzWKhumgwaYrE90vyWg

二、代码实例

1、生成二维码

  1. //加密:文字信息 -> 二维码
  2. public static void encoderQRCode(String content, String imgPath, String imgType, int size) throws Exception{
  3. //RenderedImage是一个接口,因此要找到它的实现类 BufferedImage
  4. //RenderedImage bufferedImage = null;
  5. //代表内存中的一张图片
  6. BufferedImage bufferedImage = generateQRCodeCommon(content, imgType, size);
  7. //设置图片格式,与输出的路径
  8. ImageIO.write(bufferedImage, "jpg", new File("H:/qrcode.jpg"));
  9. }
  10. //产生一个二维码的BufferedImage
  11. private static BufferedImage generateQRCodeCommon(String content, String imgType, int size) throws Exception{
  12. //QRCode对象:字符串转为boolean[][]
  13. Qrcode qrcode = new Qrcode();
  14. //设置二维码的排错率
  15. /**
  16. * 纠错等级分为
  17. * level L : 最大 7% 的错误能够被纠正;
  18. * level M : 最大 15% 的错误能够被纠正;
  19. * level Q : 最大 25% 的错误能够被纠正;
  20. * level H : 最大 30% 的错误能够被纠正;
  21. */
  22. qrcode.setQrcodeErrorCorrect('M');
  23. qrcode.setQrcodeEncodeMode('B');//注意版本信息 N代表数字 、A代表 a-z,A-Z、B代表 其他)
  24. qrcode.setQrcodeVersion(size);//尺寸 1-40
  25. boolean[][] codeOuts = qrcode.calQrcode(content.getBytes("gbk"));
  26. int imgSize = 67 + 12 * (size - 1);
  27. BufferedImage bufferedImage = new BufferedImage(imgSize, imgSize, BufferedImage.TYPE_INT_RGB);
  28. //生成一个画板
  29. Graphics2D graphics = bufferedImage.createGraphics();
  30. graphics.setBackground(Color.WHITE);//将画板的背景色设置为白色
  31. graphics.clearRect(0, 0, imgSize, imgSize);//初始化
  32. graphics.setColor(Color.BLACK);//设置画板上图像的颜色
  33. int pixoff = 2;
  34. for(int j = 0;j<codeOuts.length;j++){
  35. for(int i = 0;i<codeOuts.length;i++){
  36. if (codeOuts[j][i]) {
  37. graphics.fillRect(j * 3 + pixoff, i * 3 + pixoff, 3, 3);
  38. }
  39. }
  40. }
  41. //增加logo
  42. Image logo = ImageIO.read(new File("H:\\CSDN\\哪吒.jpg"));
  43. int maxWidth = bufferedImage.getWidth();
  44. int maxHeight = bufferedImage.getHeight();
  45. graphics.drawImage(logo, imgSize/5*2, imgSize/5*2, maxWidth/5, maxHeight/5, null);
  46. graphics.dispose();//释放空间
  47. bufferedImage.flush();//清理
  48. return bufferedImage;
  49. }

注:敲代码最重要的是思路,由ImageIO.write(bufferedImage, "jpg", new File("H:/qrcode.jpg"));入手,依次构建参数,因为RenderedImage是一个接口,因此要找到它的实现类 BufferedImage,

2、解析二维码

  1. //解密
  2. public static String decoderQRCode(String imgPath) throws IOException {
  3. //硬盘中图片加载入内存
  4. BufferedImage bufferedImage = ImageIO.read(new File(imgPath));
  5. //解密
  6. QRCodeDecoder qrCodeDecoder = new QRCodeDecoder();
  7. QRCodeImage qrCodeImage = new QRCodeImageImpl(bufferedImage);
  8. byte[] decode = qrCodeDecoder.decode(qrCodeImage);
  9. return new String(decode, "gbk");
  10. }

 

  1. package com.guor.qrcode;
  2. import jp.sourceforge.qrcode.data.QRCodeImage;
  3. import java.awt.image.BufferedImage;
  4. public class QRCodeImageImpl implements QRCodeImage {
  5. BufferedImage bufferedImage;//内存中的二维码
  6. public QRCodeImageImpl(BufferedImage bufferedImage){
  7. this.bufferedImage = bufferedImage;
  8. }
  9. @Override
  10. public int getWidth() {
  11. return bufferedImage.getHeight();
  12. }
  13. @Override
  14. public int getHeight() {
  15. return bufferedImage.getHeight();
  16. }
  17. //像素
  18. @Override
  19. public int getPixel(int x, int y) {
  20. return bufferedImage.getRGB(x, y);
  21. }
  22. }

3、测试类

  1. package com.guor.qrcode;
  2. public class QrcodeTest {
  3. public static void main(String[] args) throws Exception {
  4. String content = "https://blog.csdn.net/guorui_java/article/details/112391105";//内容信息
  5. String path = "H:/qrcode.jpg";
  6. //加密:文字信息 -> 二维码
  7. QRCodeUtil.encoderQRCode(content, path, "png", 20);
  8. //解密
  9. String decoderQRCode = QRCodeUtil.decoderQRCode(path);
  10. System.out.println(decoderQRCode);
  11. }
  12. }

4、生成的二维码

一扫出神奇,还真的跳转到了我的Java知识体系总结(2021版)博客

解析的文字:

三、遇到的问题

开始的时候,在解密的时候,出现了一个bug,

上网一搜,发现是因为中间插入的logo,设置的大小太大了,缩小一点,就好了。

 

往期精彩内容:

Java知识体系总结(2021版)

Java多线程基础知识总结(绝对经典)

超详细的springBoot学习笔记

常见数据结构与算法整理总结

Java设计模式:23种设计模式全面解析(超级详细)

Java面试题总结(附答案)



所属网站分类: 技术文章 > 博客

作者:咿呀咿呀哟

链接:http://www.javaheidong.com/blog/article/114296/3759e624840dcacb0f1e/

来源:java黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

27 0
收藏该文
已收藏

评论内容:(最多支持255个字符)