二维码“仙人”——教你制作二维码,读取二维码

我们滴效果:

 二维码现在随处可见,极大的方便了我们的生活,而你有没有对它感到好奇呢?

其实我们也可以制作简单的二维码,开始制作之前,我们需要补充一个背景。

计算机的任何信息,其实都是一串0/1的数字构成。

故基于此,我们大致的思路已经完成了:将信息全部转化为二进制码,再将0定义为黑色,1定义为白色,绘制实心正方体,而总体构成我们的二维码。

1.转换二进制方法

我们需要了解到,二进制码

     //将字符串信息转化为二进制码,存在 int数组里
     public void change() {
        //存储单个字符的字符串
        String solo = new String();
        //读取整个字符串
        for (int i = 0; i < input.length(); i++) {
            //得到单个字符
            char a = input.charAt(i);
            //将字符转换为二进制码
            int c = (int) a;
            solo = bin(c);
            //让int数组存入,因为我们的得到是字符串,所以需要判断后存入
            //一个字符串存入了16个0/1.
            for (int j = 0; j < 16; j++) {
                if (solo.charAt(j) == '0') {
                    bins.add(0);
                } else {
                    bins.add(1);
                }
            }
        }
        System.out.println(bins);
    }

    //将char转化为二进制码
    public String bin(int a) {
        //存储单个字符的字符串
        String bin = new String();
        //利用位运算,得到最后一位,然后再将数左移一位
        //字符采取的是char类型,一共有16bit,所以字符串要连接16个0/1。
        for (int i = 0; i < 16; i++) {
            //注意二进制码加入位置
            if ((a & 1) == 0) {
                bin = "0" + bin;
            } else {
                bin = "1" + bin;
            }
            a = a >> 1;
        }
        return bin;
    }

2.绘制方法

    //开始绘制
    @Override
    public void paint(Graphics g) {
        super.paint(g);
        //用于使方块间隔
        int wid = 0;
        //用于换行
        int hig = 0;
        //遍历存入所有二进制码的数组
        for (int i = 0; i < bins.size(); i++) {
            if (bins.get(i) == 0) {
                bg.setColor(Color.BLACK);
            } else {
                bg.setColor(Color.WHITE);
            }
            //size为方块尺寸
            bg.fillRect(size * wid, size * hig, size, size);
            wid++;
            //以十六个二进制码为一行,代表一个字符
            if (wid == 16) {
                wid = 0;
                hig++;
            }
        }
        g.drawImage(qrBuff, 200, 350, null);
    }

3.识别方法(将二维码放在缓存图像里识别)

      public void identify(BufferedImage qrbuff) {
                //存各种颜色int值
                int rgb, red, green, blue, gray;
                //存字符的int值
                int num = 0;
                //存储字符串
                String out = null;
                //为了防止边界干扰,我们将起点放在实心正方形的中心
                for (int j =  size / 2; j < qrbuff.getHeight(); j += size) {
                    for (int i = size / 2; i < qrBuff.getWidth(); i += size) {
                        //因为有时候图片会损失,所以不一定是纯白和纯黑,故我们引进灰度值,更好判断黑白
                        rgb = qrBuff.getRGB(i, j);
                        red = (rgb >> 16) & 255;
                        green = (rgb >> 8) & 255;
                        blue = (rgb >> 0) & 255;
                        gray = (red + green + blue) / 3;
                        if (gray > 127) {
                            //二进制位上为1
                            num = num * 2 + 1;
                        } else {
                            //二进制位上为0
                            num = num *2;
                        }
                    }
                    //防止字符串出现null。
                    //将int转化为所需的char字符,再连接到字符串上
                    if(out == null){
                        out = ""+(char)num;
                    }else {
                        out += (char) num;
                    }
                    num = 0;
                }

4.界面设计

已经完全讲烂了,只有两个点值得注意:

1.使用内部监听器,可以大量减少数据的传递

        ActionListener ac = new ActionListener() {
            //识别二维码
            @Override
        public void actionPerformed(ActionEvent e) {
            identify(qrBuff);
        }

2.使用多行文本编辑框:

        JTextArea jt = new JTextArea();
        //设置文本框大小
        jt.setPreferredSize(dim);
        //设置文本框字体
        jt.setFont(new Font("宋体", Font.BOLD,30));
        //设置换行与输出间隔一行
        jt.setLineWrap(true);
        jt.append(out+ "\n");

这样我们就大功告成了!!!

扫描二维码关注公众号,回复: 14796802 查看本文章

猜你喜欢

转载自blog.csdn.net/AkinanCZ/article/details/126493092