引言

        其实二维码就是由URL字符串转换得到的,那么手写一个最简单的字符与图像的转换如何实现呢?下面请看

字符串转二维码

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
import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferedImage;

import javax.swing.JFrame;

public class BinaryString extends JFrame {

public BinaryString() {

setTitle("二维码");
setSize(800, 600);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}

@Override
public void paint(Graphics g) {
super.paint(g);

int[] binaryArray = stringToBinaryArray("");
int[][] imgdata = new int[binaryArray.length/16][16]; //
BufferedImage buffimg = new BufferedImage(160,(binaryArray.length/16)*10,BufferedImage.TYPE_INT_ARGB);
Graphics g2 = buffimg.getGraphics();
for (int i = 0; i < imgdata.length; i++) {
for (int j = 0; j < imgdata[i].length; j++) {
imgdata[i][j] = binaryArray[i*16+j];
if(imgdata[i][j]==48) {
g2.setColor(Color.white);
}else {
g2.setColor(Color.black);
}
g2.fillRect(j*10, i*10,10, 10);
}
}
g.drawImage(buffimg, 100, 100, null);
}

int[] stringToBinaryArray(String srcStr) {
String link = "http://www.bilibili.com 天气不错"; //28个字符
// String link = "http://www.baidu.com 天气"; //28个字符
// 二进制 Str -> 二进制码
// 转成char
int strLength = link.length();
int[] binaryData = new int[strLength * 16];
for (int i = 0; i < strLength; i++) {
char c = link.charAt(i);

String binaryStr = Integer.toBinaryString(c);
System.out.println("------缺码------");
System.out.println(c);
System.out.println(binaryStr);// 缺码
// 补码:在前补 0
int binaryStrLength = binaryStr.length();

while (binaryStrLength < 16) {
binaryStr = "0" + binaryStr;
binaryStrLength++;
}
System.out.println("------全码------");
System.out.println(binaryStr);// 全码
System.out.println("--存入binaryData--");
for (int j = 0; j < 16; j++) {
System.out.println(binaryStr.charAt(j));
binaryData[i * 16 + j] = binaryStr.charAt(j);

}
}
System.out.println("------binaryData-------");
System.out.println(binaryData);
System.out.println("-----------------");
// test
int count = 0;
for (int i = 0; i < binaryData.length; i++) {
System.out.print(binaryData[i]);
System.out.print(" ");
count++;
if (count == 16) {
System.out.println();
count = 0;
}
}

return binaryData;
}

public static void main(String[] args) {

new BinaryString();
}

}

![在这里插入图片描述](https://img-blog.csdnimg.cn/20210613223458780.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3BvcG9mems=,size_16,color_FFFFFF,t_70#pic_center =200x400)
        这里输入的字符串为:”http://www.bilibili.com 天气不错“,由图可以清晰看出由于是16位,那么前面字母部分的二进制则均为0,只有后面才有黑色的1,英文字母只占满了后8位,而最后四个中文字符,才有16位进行二进制编码,占满了全部16位,不懂为啥英文占8位,中文得16位的请看另一篇讲字符串二进制的文章 计算机基础:二进制+字节+移位运算

二维码转字符串

大致思路:

  1. 读取到二维码图片,用数组存储rgb像素值,再把黑白色转成0、1二进制
  2. 每一个字符得到整理成一个二进制字符串(16位)。
  3. 再把二进制字符串转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
    117
    import 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();
    }
    }