哔哩哔哩 (゜-゜)つロ 干杯~-bilibilihttps://www.bilibili.com/
我们可以实现图片二维码转换为网址,或者将网址转换为伪二维码(与普通二维码有区别,因为没有定位点,转换成的二维码只包含信息)。
一、网址转换为二维码
1、实现原理:
我们把网址看成一串字符串,对字符串进行操作。将字符串每个字符转换成整数之后,每个整数可以用二进制来表示,二进制又由0和1来表示,0表示黑色,1表示白色,再在绘图界面上将每一个黑白像素点扩大成小矩形绘制出来,得到上述图片。
2、实现步骤:
①字符串转为为二进制码
我们把网址看成一串字符串,对字符串进行操作。
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(); //创建一个对象即会调用构造函数,运行代码
}
}