引言
其实二维码就是由URL字符串转换得到的,那么手写一个最简单的字符与图像的转换如何实现呢?下面请看
字符串转二维码
1 | import java.awt.Color; |

这里输入的字符串为:”http://www.bilibili.com 天气不错“,由图可以清晰看出由于是16位,那么前面字母部分的二进制则均为0,只有后面才有黑色的1,英文字母只占满了后8位,而最后四个中文字符,才有16位进行二进制编码,占满了全部16位,不懂为啥英文占8位,中文得16位的请看另一篇讲字符串二进制的文章 计算机基础:二进制+字节+移位运算
二维码转字符串
大致思路:
- 读取到二维码图片,用数组存储rgb像素值,再把黑白色转成0、1二进制
- 每一个字符得到整理成一个二进制字符串(16位)。
- 再把二进制字符串转String字符串(二进制字符串先转十进制数字,十进制再转字符串)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
public class Code2String {
// public String picPath;
public int w;
public int h;
public void setH(int h) {
this.h = h;
}
public void setW(int w) {
this.w = w;
}
public int[][] getImagePix(String picPath){
File file = new File(picPath);
BufferedImage img = null;
try {
img = ImageIO.read(file);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
int w = img.getWidth();
int h = img.getHeight();
setH(h);
setW(w);
System.out.println(
"图片宽度为:"+ w+ " 图片长度为:"+h
);
int[][] imgArr = new int [h][w];
System.out.println("---------imgArr----length");
System.out.println(imgArr.length);
for (int i = 0; i < imgArr.length; i++) {
for (int j = 0; j < imgArr[i].length; j++) {
imgArr[i][j] =img.getRGB(j,i);
}
}
return imgArr;
}
public static String binaryToString(ArrayList<String> binaryStringList){
String resultString = "";
for (int i = 0; i < binaryStringList.size(); i++) {
String binaryString = binaryStringList.get(i);
// System.out.println("------二进制转十进制数字------");
int binaryInt=Integer.parseInt(binaryString, 2);
int [] arrayS = {binaryInt};
// System.out.println("------十进制转字符串-------");
String s = new String(arrayS,0,arrayS.length);
resultString += s;
}
return resultString;
}
public String codeParsing(){
int [][] imgArr = getImagePix("img/pic1.png");
int zoom = Math.round((float)w/16);
int [][] binaryArr = new int[h/zoom][16]; //28x16
System.out.println("---zoom---");
System.out.println(zoom);
System.out.println("---------binaryArr.length---------");
System.out.println(binaryArr.length);
for (int i = 0; i < binaryArr.length; i++) {
for (int j = 0; j < binaryArr[i].length; j++) {
// System.out.println("---------binaryArr[i].length--------");
// System.out.println(binaryArr[i].length);
// System.out.println("第" + i + " 第"+j);
// System.out.println(j);
// System.out.println("---------imgArr[i*zoom][j*zoom]---------");
// System.out.println(imgArr[i*zoom][j*zoom]);
int rgbValue = imgArr[i*zoom][j*zoom];
int red,green,blue;
red = rgbValue >> 16 & 0xFF;
green = rgbValue >> 8 & 0xFF;
blue = rgbValue >> 0 & 0xFF;
int gray = (red + green + blue) / 3;
if (gray == 0){//黑色
binaryArr[i][j]=1;
}else {
binaryArr[i][j]=0;
}
// System.out.println("存入的值"+ gray);
}
}
System.out.println("--------------binaryArr二进制字符串-------------");
ArrayList<String> binaryStringList = new ArrayList<String>();
for (int i = 0; i < binaryArr.length; i++) {
String curString = "";
for (int j = 0; j < binaryArr[i].length; j++) {
System.out.print(binaryArr[i][j]);
curString += binaryArr[i][j];
}
binaryStringList.add(curString);
System.out.println();
}
System.out.println("-------------二进制字符串转String字符串-----------");
String binaryToString = binaryToString(binaryStringList);
System.out.println(binaryToString);
return "OK";
}
public static void main(String[] args) {
Code2String code2String = new Code2String();
code2String.codeParsing();
}
}




