大家好,又见面了,我是你们的朋友全栈君。
我们可以实现图片二维码转换为网址,或者将网址转换为伪二维码(与普通二维码有区别,因为没有定位点,转换成的二维码只包含信息)。
我们把网址看成一串字符串,对字符串进行操作。将字符串每个字符转换成整数之后,每个整数可以用二进制来表示,二进制又由0和1来表示,0表示黑色,1表示白色,再在绘图界面上将每一个黑白像素点扩大成小矩形绘制出来,得到上述图片。
①字符串转为为二进制码
我们把网址看成一串字符串,对字符串进行操作。
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
}
}
}
①、第一个类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.cn/197808.html原文链接:https://javaforall.cn