• 二维码


    Java生成二维码

    通过RQCode生成二维码

    步骤:

    1、jar包  下载qrcode.jar  https://files.cnblogs.com/files/bigroc/QRCode.zip   在项目路径下新建libs    把jar包粘贴进去  添加到类路径

    2、编码

      a、生成一个QRCode帮助类 QRCodeUtil.java

    package qrcode;
    
    import com.swetake.util.Qrcode;
    import jp.sourceforge.qrcode.QRCodeDecoder;
    
    import javax.imageio.ImageIO;
    import java.awt.*;
    import java.awt.image.BufferedImage;
    import java.io.File;
    
    public class QRCodeUtil {
        /**
         * content :文字信息
         * imgType :文件格式
         * imgPath:文件路径
         */
        //加密:文字信息->二维码
        public  void encoderQRCode(String content,String imgPath,String imgType,int size) throws Exception{
            //RenderedImage
            //内存中的图片
            BufferedImage buf = qRCodeCommon(content,imgPath,size);
            File file =new File(imgPath);
            //API 生成图片
            ImageIO.write(buf,imgType,file);
        }
    
        //产生一个二维码的bufferedImage
        /**
         * content :文字信息
         * imgType :文件格式
         * imgPath:文件路径
         */
        public BufferedImage qRCodeCommon(String content,String imgType,int size)throws Exception{
            BufferedImage bufferedImage = null;
            
            //Qrcode对象  字符串->boolean[][]
            Qrcode qrcodeHandler  = new Qrcode();
            //设置二维码的排错率   7% L<M<Q<H  30%  排错率越高 可存储的信息越少 但是对二维码清晰度要求越少
            qrcodeHandler.setQrcodeErrorCorrect('M');
            //可存储的信息类型  N:数字  A:数字+A-Z  B:所有
            qrcodeHandler.setQrcodeEncodeMode('B');
            //二维码的取值范围 1-40
            qrcodeHandler.setQrcodeVersion(size);
            byte[] contentBytes = content.getBytes("utf-8");  // "邢伟"  ---->  byte[]"邢伟"
            //   --->boolean[][]
            boolean[][] codeOut = qrcodeHandler.calQrcode(contentBytes);
    
            int imgSize = 67 +12*(size-1);
    
            //长  宽   颜色
            bufferedImage = new BufferedImage(imgSize,imgSize,BufferedImage.TYPE_INT_RGB);  //RGB
            //创建一个画板
            Graphics2D graphics2D = bufferedImage.createGraphics();
            //将画板的背景设为白色
            graphics2D.setBackground(Color.white);
            //初始化
            graphics2D.clearRect(0,0,imgSize,imgSize);
            //设置画板上 图像的颜色
            graphics2D.setColor(Color.black);
            //偏移量
            int pixOff = 2 ;
            for(int j =0;j<codeOut.length;j++){
                for (int i =0; i<codeOut.length;i++){
                    if(codeOut[j][i]){
                        graphics2D.fillRect(j*3+pixOff,i*3+pixOff,3,3);
                    }
                }
            }
    
            //增加logo  将硬盘中的图片加载为Image对象
            Image logo = ImageIO.read(new File("src/logo.png")) ;
            int maxHeight = bufferedImage.getHeight();
            int maxWidth = bufferedImage.getWidth();
            //在以生产的二维码上  化logo
            graphics2D.drawImage(logo,imgSize/5*2,imgSize/5*2,maxWidth/5,maxHeight/5,null);
    
            //释放
            graphics2D.dispose();
            //刷新
            bufferedImage.flush();
            return bufferedImage;
        }
    
        //    解密:二维码(图片)->文字信息
        public String decodeQRCode(String imgPath) throws Exception{
            //BufferedImage 内存中一张图片   硬盘里的imgPath图片  ->内存中的 BufferedImage
            BufferedImage bufImg = ImageIO.read(new File(imgPath));
            //解密方法
            QRCodeDecoder decoder = new QRCodeDecoder();
            //实现接口QRCodeImage
            TwoDimensionCodeImage twoDimensionCodeImage = new TwoDimensionCodeImage(bufImg);
            byte[] bs = decoder.decode(twoDimensionCodeImage);//bufImg
            String content = new String(bs,"utf-8");
            return content ;
        }
    }

     

     b、在进行解密时 我们需要一个      byte[] bs = decoder.decode(twoDimensionCodeImage);    //bufImg

    package qrcode;
    
    import jp.sourceforge.qrcode.data.QRCodeImage;
    
    import java.awt.image.BufferedImage;
    
    public class TwoDimensionCodeImage implements QRCodeImage {
        BufferedImage bufferedImage ; //内存中的二维码
        public TwoDimensionCodeImage(BufferedImage bufferedImage){
            this.bufferedImage = bufferedImage;
        }
        @Override
        public int getWidth() {
            return bufferedImage.getHeight();
        }
    
        @Override
        public int getHeight() {
            return bufferedImage.getWidth();
        }
    
        @Override
        public int getPixel(int x, int y) {
            return bufferedImage.getRGB(x,y);
        }
    }

     c、测试

    package qrcode;
    
    import jp.sourceforge.qrcode.util.QRCodeUtility;
    
    public class Test {
        public static void main(String[] args) throws Exception{
            /**
             * 生成二维码
             * 生成图片的路径
             *文字信息 网址信息  “helloword”
             */
            String imgPath = "src/二维码.png";
            String content = "http://www.baidu.com";  //扫描二维码后自动跳转
            //生成二维码
            QRCodeUtil qrCodeUtil = new QRCodeUtil();
            //加密:文字信息->二维码
            qrCodeUtil.encoderQRCode(content,imgPath,"png",20);
    
    
            //解密:二维码->文字信息
            String imgContent = qrCodeUtil.decodeQRCode(imgPath);
            System.out.println(imgContent);
        }
    }
    做的不好,多多指教
  • 相关阅读:
    获取文件夹下的所有文件名,并修改某些文件名 Alec
    生成XML文件,并保存到本地文件 Alec
    按Enter键起到Tab键的效果 Alec
    网站底部浮动js Alec
    NET Framework4.0注册 Alec
    从FTP上下载文件到本地 Alec
    生成txt日志操作文件 Alec
    不使用第三个变量,实现两个变量值的交换 Alec
    生成指定位数的回文素数 Alec
    单击gridview某一列弹出详细信息 Alec
  • 原文地址:https://www.cnblogs.com/xingStudy/p/12838453.html
Copyright © 2020-2023  润新知