【java实现网址转换为二维码】

                ​​​​​哔哩哔哩 (゜-゜)つロ 干杯~-bilibilihttps://www.bilibili.com/​​        

                

        我们可以实现图片二维码转换为网址,或者将网址转换为伪二维码(与普通二维码有区别,因为没有定位点,转换成的二维码只包含信息)。

一、网址转换为二维码

1、实现原理:

        我们把网址看成一串字符串,对字符串进行操作。将字符串每个字符转换成整数之后,每个整数可以用二进制来表示,二进制又由0和1来表示,0表示黑色,1表示白色,再在绘图界面上将每一个黑白像素点扩大成小矩形绘制出来,得到上述图片。

2、实现步骤:

字符串转为为二进制码

我们把网址看成一串字符串,对字符串进行操作。

a.字符串转为整数  b.整数转二进制码
我们用一个方法来实现
StringtoBiarray(),返回一个字符串数组,储存着二进制码的信息
public String[] StringtoBiarray(){

        String str = "https://bilibili.com";
        String []binaryStrar = new String [str.length()];
        // 取出单个的字符
        for (int i = 0; i < str.length(); i++) {
            //将不规则的字符串转为整数
            char strtoBiary=  str.charAt(i);

            //用int类型吸收char类型
            int biary=strtoBiary;

            //将整数转为二进制
            String binaryStr=Integer.toBinaryString(biary);

            //将二进制补为8位,前面补零
            while(binaryStr.length()<8) {
                binaryStr = 0 + binaryStr;
            }
            System.out.println(binaryStr);
            //将二进制码存储入数组
            binaryStrar[i]=binaryStr;
        }
        return binaryStrar;
    }

如果将其输出,即为下列结果

根据二进制码的顺序: 0绘制一个白块 1绘制一个黑块

a.绘制窗体       

绘制窗体的方法,在我的另一篇中有详细介绍【java创建能够画直线的窗口界面】_ZERO_HOPE的博客-CSDN博客_java 窗口画线

此处采用继承JFrame的方式,构造函数来绘制窗体。重写paint 方法,将绘制的图像加载在窗体上。

public class QRCodeUI extends JFrame {

1)创建储存二进制信息的数组

String []binaryStrArray = {};

2)构造方法

public QRCodeUI(){
        setTitle("二维码图片");
        setSize(900,800);
        setDefaultCloseOperation(3);
        setVisible(true);
    }

3)主函数方法

public static void main(String[] args) {
        QRCodeUI qrCodeUI = new QRCodeUI();
        QRCode qrCode = new QRCode();
        //创建对象后,调用方法
        qrCodeUI.binaryStrArray = qrCode.StringtoBiarray();
    }

4)paint方法

public void paint(Graphics g) {
        super.paint(g);
        //绘制图形
        for (int i = 0; i < binaryStrArray.length; i++) {

            String str = binaryStrArray[i];

            for (int j = 0; j < str.length(); j++) {
               //注意i和j
                char c = str.charAt(j);
                if(c=='0'){
                    g.setColor(Color.white);
                }else{
                    g.setColor(Color.black);
                }
                g.fillRect(50+i*30,50+j*30,30,30);//每个小矩形位置变化,长宽30
            }
        }

    }

3、完整代码

①、第一个类QRCodeUI 

public class QRCodeUI extends JFrame {
    String []binaryStrArray = {};


    public QRCodeUI(){
        setTitle("二维码图片");
        setSize(900,800);
        setDefaultCloseOperation(3);
        setVisible(true);
    }

    public static void main(String[] args) {
        QRCodeUI qrCodeUI = new QRCodeUI();
        QRCode qrCode = new QRCode();

        qrCodeUI.binaryStrArray = qrCode.StringtoBiarray();
    }

    @Override
    public void paint(Graphics g) {
        super.paint(g);

        for (int i = 0; i < binaryStrArray.length; i++) {

            String str = binaryStrArray[i];

            for (int j = 0; j < str.length(); j++) {
               //注意i和j
                char c = str.charAt(j);
                if(c=='0'){
                    g.setColor(Color.white);
                }else{
                    g.setColor(Color.black);
                }
                g.fillRect(50+i*30,50+j*30,30,30);
            }
        }

    }
}

②、第二个类

public class QRCode {

//    String str;
//    String []binaryStrarr = new String [str.length()];


    public String[] StringtoBiarray(){

        String str = "https://bilibili.com";
        String []binaryStrar = new String [str.length()];
        // 取出单个的字符
        for (int i = 0; i < str.length(); i++) {
            //将不规则的字符串转为整数
            char strtoBiary=  str.charAt(i);

            //用int类型吸收char类型
            int biary=strtoBiary;

            //将整数转为二进制
            String binaryStr=Integer.toBinaryString(biary);

            //将二进制补为8位,前面补零
            while(binaryStr.length()<8) {
                binaryStr = 0 + binaryStr;
            }
            System.out.println(binaryStr);
            //将二进制码存储入数组
            binaryStrar[i]=binaryStr;
        }
        return binaryStrar;
    }

三、二维码转换为网址

1、实现原理:与上面相反。识别图片后,获取每一个黑白块信息,每个黑白块是0或1,所以每一列的黑白块组成一串二进制编码。(而"https://bilibili.com"这个字符串有20个字符,便说明有20串二进制编码。)再由二进制码转换为整型,最后再转化为字符型输出,即可得到网址。

2、实现步骤:

①先将二维码图片存放在文件夹中,然后在构造函数中,用String获取图片路径,以此获取图片文件。

②将图片传给缓冲图片对象,对缓冲图片对象进行操作,获取图像宽w高h。

③创建一个图像二维数组储存图像信息,用w除以20,得到每个方块的宽度width。

④在for循环中,创建一个字符串str来储存二进制编码。从每一个方块的中心取像素点,得到白色或黑色,创建整型rgb储存得到的像素值,通过像素值创建像素对象,用于灰度判断黑色白色,如果大于125,则是黑色,在字符串后添0,白色则添1。

⑤一次循环后,将字符串str转化为int型,再将int 型强制转化为(char)型,输出字符。 

int i1 = Integer.parseInt(str, 2);  //传入str,2代表二进制编码方式

System.out.print((char)i1);    //输出完整网址

每循环一次,得到一个字符,循环结束后,打印出网址。

3、完整代码

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class QRCode {

    int [][]arr={};

    public QRCode(){
        String imagPath="C:\\Desktop\\picture\\test.png";    //存放图片路径
        arr=getImagePixArray(imagPath);
    }

        public int[][] getImagePixArray(String path) {
        File file=new File(path);

        //缓冲图片对象
        BufferedImage buffimg=null;

        try {//读取文件给缓冲图
            buffimg = ImageIO.read(file);
        }catch(IOException e){
            e.printStackTrace();
        }

        // 获取图片尺寸
        int w=buffimg.getWidth();
        int h=buffimg.getHeight();
        int [][] imgarr=new int[w][h];
            int width=w/20;

        for(int i=width/2;i<w;i+=width) {
            String str="";

            for(int j=width/2;j<8*width;j+=width) {

                int rgb=buffimg.getRGB(i,j);
                Color color = new Color (rgb);
                int gray = ((color.getRed()+color.getGreen()+color.getGreen())/3);

                if (gray>125){
                    str+="0";
                }else {
                    str+="1";
                }
            }
            int i1 = Integer.parseInt(str, 2);
            System.out.println(str+ " --- "+(char)+i1);
        }
        return imgarr;
    }

    public static void main(String[] args) {
        new QRCode();    //创建一个对象即会调用构造函数,运行代码

    }


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值