发布于2021-03-13 14:13 阅读(714) 评论(0) 点赞(27) 收藏(0)
QR Code码,是由Denso公司于1994年9月研制的一种矩阵二维码符号,它具有一维条码及其它二维条码所具有的信息容量大、可靠性高、可表示汉字及图象多种文字信息、保密防伪性强等优点。
先下载QRCode.jar包:https://pan.baidu.com/s/1Pb9XzWKhumgwaYrE90vyWg
- //加密:文字信息 -> 二维码
- public static void encoderQRCode(String content, String imgPath, String imgType, int size) throws Exception{
- //RenderedImage是一个接口,因此要找到它的实现类 BufferedImage
- //RenderedImage bufferedImage = null;
- //代表内存中的一张图片
- BufferedImage bufferedImage = generateQRCodeCommon(content, imgType, size);
- //设置图片格式,与输出的路径
- ImageIO.write(bufferedImage, "jpg", new File("H:/qrcode.jpg"));
- }
-
- //产生一个二维码的BufferedImage
- private static BufferedImage generateQRCodeCommon(String content, String imgType, int size) throws Exception{
- //QRCode对象:字符串转为boolean[][]
- Qrcode qrcode = new Qrcode();
- //设置二维码的排错率
- /**
- * 纠错等级分为
- * level L : 最大 7% 的错误能够被纠正;
- * level M : 最大 15% 的错误能够被纠正;
- * level Q : 最大 25% 的错误能够被纠正;
- * level H : 最大 30% 的错误能够被纠正;
- */
- qrcode.setQrcodeErrorCorrect('M');
- qrcode.setQrcodeEncodeMode('B');//注意版本信息 N代表数字 、A代表 a-z,A-Z、B代表 其他)
- qrcode.setQrcodeVersion(size);//尺寸 1-40
-
- boolean[][] codeOuts = qrcode.calQrcode(content.getBytes("gbk"));
-
- int imgSize = 67 + 12 * (size - 1);
-
- BufferedImage bufferedImage = new BufferedImage(imgSize, imgSize, BufferedImage.TYPE_INT_RGB);
- //生成一个画板
- Graphics2D graphics = bufferedImage.createGraphics();
- graphics.setBackground(Color.WHITE);//将画板的背景色设置为白色
- graphics.clearRect(0, 0, imgSize, imgSize);//初始化
- graphics.setColor(Color.BLACK);//设置画板上图像的颜色
-
- int pixoff = 2;
- for(int j = 0;j<codeOuts.length;j++){
- for(int i = 0;i<codeOuts.length;i++){
- if (codeOuts[j][i]) {
- graphics.fillRect(j * 3 + pixoff, i * 3 + pixoff, 3, 3);
- }
- }
- }
- //增加logo
- Image logo = ImageIO.read(new File("H:\\CSDN\\哪吒.jpg"));
- int maxWidth = bufferedImage.getWidth();
- int maxHeight = bufferedImage.getHeight();
- graphics.drawImage(logo, imgSize/5*2, imgSize/5*2, maxWidth/5, maxHeight/5, null);
- graphics.dispose();//释放空间
- bufferedImage.flush();//清理
- return bufferedImage;
- }
注:敲代码最重要的是思路,由ImageIO.write(bufferedImage, "jpg", new File("H:/qrcode.jpg"));入手,依次构建参数,因为RenderedImage是一个接口,因此要找到它的实现类 BufferedImage,
- //解密
- public static String decoderQRCode(String imgPath) throws IOException {
- //硬盘中图片加载入内存
- BufferedImage bufferedImage = ImageIO.read(new File(imgPath));
- //解密
- QRCodeDecoder qrCodeDecoder = new QRCodeDecoder();
- QRCodeImage qrCodeImage = new QRCodeImageImpl(bufferedImage);
- byte[] decode = qrCodeDecoder.decode(qrCodeImage);
- return new String(decode, "gbk");
- }
- package com.guor.qrcode;
-
- import jp.sourceforge.qrcode.data.QRCodeImage;
-
- import java.awt.image.BufferedImage;
-
- public class QRCodeImageImpl implements QRCodeImage {
- BufferedImage bufferedImage;//内存中的二维码
- public QRCodeImageImpl(BufferedImage bufferedImage){
- this.bufferedImage = bufferedImage;
- }
-
- @Override
- public int getWidth() {
- return bufferedImage.getHeight();
- }
-
- @Override
- public int getHeight() {
- return bufferedImage.getHeight();
- }
-
- //像素
- @Override
- public int getPixel(int x, int y) {
- return bufferedImage.getRGB(x, y);
- }
- }
- package com.guor.qrcode;
-
- public class QrcodeTest {
- public static void main(String[] args) throws Exception {
- String content = "https://blog.csdn.net/guorui_java/article/details/112391105";//内容信息
- String path = "H:/qrcode.jpg";
- //加密:文字信息 -> 二维码
- QRCodeUtil.encoderQRCode(content, path, "png", 20);
- //解密
- String decoderQRCode = QRCodeUtil.decoderQRCode(path);
- System.out.println(decoderQRCode);
- }
- }
一扫出神奇,还真的跳转到了我的Java知识体系总结(2021版)博客
解析的文字:
开始的时候,在解密的时候,出现了一个bug,
上网一搜,发现是因为中间插入的logo,设置的大小太大了,缩小一点,就好了。
往期精彩内容:
作者:咿呀咿呀哟
链接:http://www.javaheidong.com/blog/article/114296/3759e624840dcacb0f1e/
来源:java黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 java黑洞网 All Rights Reserved 版权所有,并保留所有权利。京ICP备18063182号-2
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!