【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();    //创建一个对象即会调用构造函数,运行代码

    }


}

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(1)
blank

相关推荐

  • java中的三元表达式_逻辑运算符两侧的数据类型

    java中的三元表达式_逻辑运算符两侧的数据类型一、分析当你使用三元运算符,两边的操作数的类型不一致的时候,这就涉及到三元操作符的转换规则:1.若果两个操作数不可转换,则不做转换,返回值为Object类型。2.若两个操作数是明确类型的表达式(比如变量),则按照正常的二进制数字来转换。int类型转换为long类型,long类型转换成float类型。3.若两个操作数中有一个是数字S,另外一个是表达式,且其类型为T,那

    2022年10月21日
  • java JSON使用之JSONObject、JSONArray与Object的转换

    java JSON使用之JSONObject、JSONArray与Object的转换1、将java对象转换成json字符串:     Personp1=newPerson();     p1.setName(“xxx”);     p1.setAge(18);     StringjsonStr=JSONObject.fromObject(p1).toString();2、将

  • height:100%失败

    height:100%失败

  • linux安装mysql5.7.24

    linux安装mysql5.7.24linux安装mysql5.7.24一、卸载mysql安装有三种方式,包括二进制包安装(UsingGenericBinaries)、RPM包安装、源码安装。一般是前两种比较多卸载方法参考Linux->卸载Mysql方法总结,记得卸载干净二、安装建议路径设置按照写的来将下载的压缩包复制到linux服务器/usr/local/路径下(下载地址https://de…

  • 回归分析中自变量取舍、检验及多重共线性处理(VIF)「建议收藏」

    回归分析中自变量取舍、检验及多重共线性处理(VIF)「建议收藏」A1正交假定:误差项矩阵与X中每一个x向量都不相关高斯-马尔科夫定理:若满足A1和A2假定,则采用最小二乘法得到回归参数估计是最佳线性无偏估计方程估计值b1和b2可以看做偏回归系数,也是相应自变量对y的一种偏效应偏效应:在控制变量下,各自变量X对因变量Y的净效应残差项:针对具体模型而言,被定义为样本回归模型中观测值与预测值之差误差项:针对总体真实回归模型而言,它由一些不可观测因素或测量…

  • 图像识别算法

    图像特征包括颜色特征、纹理特征、形状特征以及局部特征点等。局部特点具有很好的稳定性,不容易受外界环境的干扰。1.局部特征点图像特征提取是图像分析与图像识别的前提,它是将高维的图像数据进行简化表达最有效的方式,从一幅图像的M×N×3的数据矩阵中,我们看不出任何信息,所以我们必须根据这些数据提取出图像中的关键信息,一些基本元件以及它们的关系。局部特征点是图像特征的局部

发表回复

您的电子邮箱地址不会被公开。

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