我们滴效果:
二维码现在随处可见,极大的方便了我们的生活,而你有没有对它感到好奇呢?
其实我们也可以制作简单的二维码,开始制作之前,我们需要补充一个背景。
计算机的任何信息,其实都是一串0/1的数字构成。
故基于此,我们大致的思路已经完成了:将信息全部转化为二进制码,再将0定义为黑色,1定义为白色,绘制实心正方体,而总体构成我们的二维码。
1.转换二进制方法
我们需要了解到,二进制码
//将字符串信息转化为二进制码,存在 int数组里
public void change() {
//存储单个字符的字符串
String solo = new String();
//读取整个字符串
for (int i = 0; i < input.length(); i++) {
//得到单个字符
char a = input.charAt(i);
//将字符转换为二进制码
int c = (int) a;
solo = bin(c);
//让int数组存入,因为我们的得到是字符串,所以需要判断后存入
//一个字符串存入了16个0/1.
for (int j = 0; j < 16; j++) {
if (solo.charAt(j) == '0') {
bins.add(0);
} else {
bins.add(1);
}
}
}
System.out.println(bins);
}
//将char转化为二进制码
public String bin(int a) {
//存储单个字符的字符串
String bin = new String();
//利用位运算,得到最后一位,然后再将数左移一位
//字符采取的是char类型,一共有16bit,所以字符串要连接16个0/1。
for (int i = 0; i < 16; i++) {
//注意二进制码加入位置
if ((a & 1) == 0) {
bin = "0" + bin;
} else {
bin = "1" + bin;
}
a = a >> 1;
}
return bin;
}
2.绘制方法
//开始绘制
@Override
public void paint(Graphics g) {
super.paint(g);
//用于使方块间隔
int wid = 0;
//用于换行
int hig = 0;
//遍历存入所有二进制码的数组
for (int i = 0; i < bins.size(); i++) {
if (bins.get(i) == 0) {
bg.setColor(Color.BLACK);
} else {
bg.setColor(Color.WHITE);
}
//size为方块尺寸
bg.fillRect(size * wid, size * hig, size, size);
wid++;
//以十六个二进制码为一行,代表一个字符
if (wid == 16) {
wid = 0;
hig++;
}
}
g.drawImage(qrBuff, 200, 350, null);
}
3.识别方法(将二维码放在缓存图像里识别)
public void identify(BufferedImage qrbuff) {
//存各种颜色int值
int rgb, red, green, blue, gray;
//存字符的int值
int num = 0;
//存储字符串
String out = null;
//为了防止边界干扰,我们将起点放在实心正方形的中心
for (int j = size / 2; j < qrbuff.getHeight(); j += size) {
for (int i = size / 2; i < qrBuff.getWidth(); i += size) {
//因为有时候图片会损失,所以不一定是纯白和纯黑,故我们引进灰度值,更好判断黑白
rgb = qrBuff.getRGB(i, j);
red = (rgb >> 16) & 255;
green = (rgb >> 8) & 255;
blue = (rgb >> 0) & 255;
gray = (red + green + blue) / 3;
if (gray > 127) {
//二进制位上为1
num = num * 2 + 1;
} else {
//二进制位上为0
num = num *2;
}
}
//防止字符串出现null。
//将int转化为所需的char字符,再连接到字符串上
if(out == null){
out = ""+(char)num;
}else {
out += (char) num;
}
num = 0;
}
4.界面设计
已经完全讲烂了,只有两个点值得注意:
1.使用内部监听器,可以大量减少数据的传递
ActionListener ac = new ActionListener() {
//识别二维码
@Override
public void actionPerformed(ActionEvent e) {
identify(qrBuff);
}
2.使用多行文本编辑框:
JTextArea jt = new JTextArea();
//设置文本框大小
jt.setPreferredSize(dim);
//设置文本框字体
jt.setFont(new Font("宋体", Font.BOLD,30));
//设置换行与输出间隔一行
jt.setLineWrap(true);
jt.append(out+ "\n");
这样我们就大功告成了!!!
扫描二维码关注公众号,回复:
14796802 查看本文章