1.二维码的概念
二维码是用某种特定的几何图形按一定规律在二维方向上分布的、黑白相间的、记录数据符号信息的图形;在代码编制上巧妙地利用构成计算机内部逻辑基础的“0”、“1”比特流的概念,使用若干个与二进制相对应的几何形体来表示文字数值信息,通过图象输入设备或光电扫描设备自动识读以实现现信息自动处理。
2.生成二维码的原理
将数据信息转换为二进制码,并按一定规律将二进制码排列在图片上。若二进制值为0,则将对应位置填充白色,若二进制值为1,则将对应位置填充黑色。
如何将各种不同的数据转换为二进制呢,可以将数据转换为字符型变量,字符型变量可以转换为十进制,再由对应的十进制数转换为表示二进制的字符串。
如字符‘二’的十进制为20108,二进制为100111010001100将二进制转换为黑白条如下:
3.实现的功能
*创建一个窗体,实现交互,可以在输入框中输入想要二维化的字符串
*将输入字符串转换为二进制,并在运行结果框中分别输出其十进制和二进制
*根据每个字符的二进制值生成一列黑白条,并将所有条组成二维码
4.代码实现
4.1.创建窗体
public QRCode() {
setSize(800,800);
setTitle("二维码生成");
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLocationRelativeTo(null);
FlowLayout f1=new FlowLayout();
setLayout(f1);
JButton btn=new JButton("生成二维码");
btn.addActionListener(lis);//lis为要添加的监听器
JTextField jtf=new JTextField(50);
add(jtf);
add(btn);
setVisible(true);
lis.g=getGraphics();
lis.text=jtf;
}
4.2.toBinary()方法
public static String toBinary(int decimal){
if(decimal==0){
return "";
}else{
return toBinary(decimal/2)+decimal%2;
}
}
该方法将十进制数转换为二进制,对字符型数据同样适用,在运算中char型数据自动转换为int型。
4.3strToBinarys()方法
public String[] strToBinarys(String str){
String[] codeArr=new String[str.length()];
for(int i=0;i<str.length();i++){
char ch=str.charAt(i);//取出第i位字符
int x=ch;//x为字符的十进制
String binaryStr=toBinary(ch);
//若不足八位则在二进制字符前补0
while(binaryStr.length()<8){
binaryStr="0"+binaryStr;
}
System.out.println(ch+"的十进制是:"+x+",二进制是"+binaryStr);//输出信息
codeArr[i]=binaryStr;//将字符的第i位存储到字符数组的第i位
}
return codeArr;
}
4.4.创建QRCodeListener监听器
public class QRCodeListener implements ActionListener {
Graphics g;//画笔
JTextField text;//窗体上文本框对象
@Override
public void actionPerformed(ActionEvent e) {
String btnText=e.getActionCommand();//获取按钮文本
String textStr=text.getText();//获取文本框文本
if(btnText.equals("生成二维码")){
String[] codeArr=strToBinarys(textStr);
for(int i=0;i<codeArr.length;i++){
for(int j=0;j<codeArr[i].length();j++){
char ch=codeArr[i].charAt(j);
//为0涂白,为1涂黑
if(ch=='0'){
g.setColor(Color.white);
}else if(ch=='1'){
g.setColor(Color.black);
}
g.fillRect(50+i*25,150+j*25,25,25);//一个黑白块边长为25
}
}
}
}
//public static String toBinary(int decimal)
//public String[] strToBinarys(String str)
}
创建监听器,并将text,g对象传入监听器中。
lis.g=getGraphics();
lis.text=jtf;
5.运行结果
运行后我们发现中文和英文生成的二维码长度不一样,这是因为中文大部分是占两个字节,需要16位二进制来表示,而英文字符只占一个字节,用8位二进制就足够表示。我们可以将strToBinarys()方法中binaryStr.length()<8改为所需的长texttext