【java实现网址转换为二维码】「建议收藏」

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

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

                ​​​​​哔哩哔哩 (゜-゜)つロ 干杯~-bilibili【java实现网址转换为二维码】「建议收藏」https://www.bilibili.com/​​        

【java实现网址转换为二维码】「建议收藏」

                

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

一、网址转换为二维码

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;
    }

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

【java实现网址转换为二维码】「建议收藏」

根据二进制码的顺序: 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();    //创建一个对象即会调用构造函数,运行代码

    }


}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/197808.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • idea2021激活码永久3月最新在线激活

    idea2021激活码永久3月最新在线激活,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月14日
    80
  • 恢复Cisco路由器密码

    恢复Cisco路由器密码

    2021年7月26日
    72
  • windows security notification_windows product activation

    windows security notification_windows product activation来源:《WCF服务编程(第三版)》

    2022年10月7日
    0
  • 匹配电子邮箱的正则表达式_怎样设置电子邮箱

    匹配电子邮箱的正则表达式_怎样设置电子邮箱电子邮件格式  电子邮件地址的格式是域内部分@域,其中域内部分最长为64个字符,而域名最长可达255个字符。例如:name@domainname可以使用任意ASCII字符:大小写英文字母a-z,A-Z数字0-9name部分只允许输入‘-’、’_’、’.’。原则上字符  !#$%&’*±/=?^`{|}~  甚至空格都可以输入,但是有些邮件服务器会拒绝包含有特殊字符的邮件地址一般来说只允许输入‘-’、’_’、’.’这三个特殊符号字符‘.’不能

    2022年9月23日
    0
  • 【C++】容器类_容器迭代器

    【C++】容器类_容器迭代器C++中的容器类对比起其它语言,无论是《【Python】容器类》(点击打开链接),还是《【Java】Java中的Collections类——Java中升级版的数据结构》(点击打开链接)的容器类都没有C++中的容器复杂。且不说C++像Java一样,不能如同Python与php的数组,天生就是可变,不定长,越界就出现问题。C++中的容器,虽然与Java一样同样有List与Map,但是,其提供的封装方法

    2022年9月4日
    2
  • linux——awk(7):awk数组详解

    linux——awk(7):awk数组详解awk中数组的使用。我们在其他语言中经常会使用到数组,awk中也可以使用。示例如下:与其他不同的是,awk中的数组元素值可以设置为”空字符串“,当设定某一个元素为”空字符串“时,打印出的值就是为”空“(注:”空格“不为”空“)。鉴于awk中,元素的值可以为”空“,我们就不能根据元素的值是否为”空“去判断元素是否存在了。另外即使在模式中没有提前设定某个字符的存在,如果print中进行了引用,…

    2022年7月19日
    14

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号