手写简易二维码

引言

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

字符串转二维码

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();
	}

}

在这里插入图片描述
        这里输入的字符串为:”http://www.bilibili.com 天气不错“,由图可以清晰看出由于是16位,那么前面字母部分的二进制则均为0,只有后面才有黑色的1,英文字母只占满了后8位,而最后四个中文字符,才有16位进行二进制编码,占满了全部16位,不懂为啥英文占8位,中文得16位的请看另一篇讲字符串二进制的文章 计算机基础:二进制+字节+移位运算

二维码转字符串

大致思路:

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

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SpringBoot的手写简易流程可以通过以下几个步骤来实现: 1. 创建一个新的Java项目,并导入所需的依赖。这些依赖可以包括SpringBoot的核心模块、Web模块以及其他你需要的模块。 2. 创建一个主应用程序类,通常命名为`MyApplication`。这个类需要使用`@SpringBootApplication`注解标记,以指示它是SpringBoot应用程序的入口。 3. 在主应用程序类中,可以定义一些需要的配置和组件。例如,你可以使用`@Configuration`注解创建一个配置类,使用`@Bean`注解创建一些Bean实例。 4. 编写业务代码。在这个例子中,你可以创建一个`User`类来表示用户,并且定义一些操作用户的方法。 5. 启动应用程序。可以通过在主应用程序类中添加一个`main`方法,并在该方法中调用`SpringApplication.run(MyApplication.class, args)`来启动应用程序。 6. 测试应用程序。可以编写一些测试类,使用JUnit或其他测试框架来测试你编写的业务代码。 这样,你就可以手写一个简易的SpringBoot应用程序。通过编写配置、组件和业务代码,并启动应用程序来测试它。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [学习SpringBoot源码之手写一个简易版SpringBoot](https://blog.csdn.net/xjx666666/article/details/128205845)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值