精华内容
下载资源
问答
  • 二维码识别16进制
    千次阅读
    2022-03-24 16:18:00

    一、二维码生成

    思路:将字符串中的每个字符转为二进制码字符串,保存在二进制码字符串数组中。对二进制码字符串数组中的每个二进制码字符串进行字符遍历,若是‘0’,则设置画笔颜色为白色,若是‘1’,则设置画笔颜色为黑色。最后绘制图片。

    例如,生成字符串"http://bilibili.com"的二维码

    1、将字符串中的每个字符转为二进码字符串

    String str="http://bilibili.com";
    for(int i=0;i<str.length();i++) {
    			char c=str.charAt(i);//获取字符串中的每个字符
    			String binarystring=Integer.toBinaryString(c);//将字符转为而二进码字符串

    此时我们打印输出二进码字符串,会发现输出的二进制数不规则,有7bit也有8bit的。所以我们需要对不足8bit的二进数前面补‘0’,使得到的二进数都是8bit的,然后再将其保存到数组中。

    //补码 在二进制数不足8个bit的前面补0
    			while(binarystring.length()<8) {
    				binarystring=0+binarystring;	
    			}

    2、保存在二进制码字符串数组中

    String[] Binarystring=new String[str.length()];//定义一个一维数组
    for(int j=0;j<str.length();j++) {
    				Binarystring[i]=binarystring;
    			}

    3、遍历二进制码字符串中的字符,设置画笔颜色,绘制图片

    for(int i=0;i<binarystring.length;i++) {
    			String str=binarystring[i];
    			for(int j=0;j<str.length();j++) {
    				char c=str.charAt(j);
    				if(c=='0') {
    					g.setColor(Color.white);
    				}else {
    					g.setColor(Color.black);
    				}
    				g.fillRect(200+i*10, 100+j*10, 10, 10);
    			}
    		}
    		
    	}

     4、完整代码

    QRcode类:将字符串转换为二进码字符串,创建保存二进码字符串数组

    public class QRcode {
    	String str="http://bilibili.com";
    	String[] Binarystring=new String[str.length()];//定义一个一维数组
    	public String[] tobinarystring() {
    		for(int i=0;i<str.length();i++) {
    			char c=str.charAt(i);//获取字符串中的每个字符
    			String binarystring=Integer.toBinaryString(c);//字符转为二进制码字符串
    			//System.out.println(binarystring);//输出的二进制不规则 有7个bit也有8个bit
    			//补码 在二进制数不足8个bit的前面补0
    			while(binarystring.length()<8) {
    				binarystring=0+binarystring;	
    			}
    			//此时二进制数都是8个bit 需将这些二进数存储到数组中
    			for(int j=0;j<str.length();j++) {
    				Binarystring[i]=binarystring;
    			}
    		}
    		return Binarystring;
    	}	
    
    }
    

    QRcodeUI类:二维码窗体界面类,用来绘制二维码(二值化图片)

    import java.awt.Color;
    import java.awt.Graphics;
    import javax.swing.JFrame;
    public class QRcodeUI extends JFrame {
    	private static final long serialVersionUID = 1L;
    	QRcode qrcode=new QRcode();
    	String[] binarystring=qrcode.tobinarystring();//调用QRcode类中创建二进制码字符串数组的方法
    	//创建窗体界面
    	public void init() {
    		setTitle("二维码");
    		setSize(800,600);
    		setDefaultCloseOperation(EXIT_ON_CLOSE);
    		setVisible(true);
    		Graphics g=getGraphics();
    		paint(g);
    	}
    	//创建绘图方法
    	public void paint(Graphics g) {
    		super.paint(g);
    		//遍历二进制码字符串中的字符
    		for(int i=0;i<binarystring.length;i++) {
    			String str=binarystring[i];
    			for(int j=0;j<str.length();j++) {
    				char c=str.charAt(j);
    				//设置画笔颜色
    				if(c=='0') {
    					g.setColor(Color.white);
    				}else {
    					g.setColor(Color.black);
    				}
    				//绘制图片
    				g.fillRect(200+i*10, 100+j*10, 10, 10);
    			}
    		}
    		
    	}
    	public static void main(String[]args) {
    		QRcodeUI qrdcodeui=new QRcodeUI();
    		qrdcodeui.init();
    	}
    		
    }
    	
    
    
    

    5、效果图

    5

    二、二维码识别

    思路:将获得的二维码图片转为int类型的二维数组,保存该图片的像素点。根据图片的宽度和方向进行取值,并设置灰度值,若灰度值大于100,则取二进制码0,否则则取1,从而获得二进码字符串。将获得的二进制码字符串先转为整数,再强制转为字符。然后将获得的字符保存到字符数组中,最后遍历输出字符数组中的字符。

    1、将二维码图片转为int类型的二维数组

    public int[][] getpixelarray(String imgpath){
    		BufferedImage img=null;
    		try {
    			img=ImageIO.read(new File(imgpath));//根据路径生成图片
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		//获取图片的宽和高
    		int w=img.getWidth();
    		int h=img.getHeight();
    		
    		int[][] imgarr=new int[w][h];
    		for(int i=0;i<w;i++) {
    			for(int j=0;j<h;j++) {
    				imgarr[i][j]=img.getRGB(i, j);
    			}
    		}
    		return imgarr;
    	}

    2、设置灰度值,根据灰度值进行判断,获得二进码字符串

    int[][] imgarr= getpixelarray("C:\\Users\\011\\Pictures\\Saved Pictures\\QRcode1.png");
    int w=imgarr.length;
    int width=w/20;//格子宽度
    //考虑到可能会取到边界,所以需要改变起点,i、j不是从0取起,从每个矩形中点取起
    for(int i=width/2;i<imgarr.length;i+=width) {
    	String str="";//声明字符串
    	for(int j=width/2;j<width*8;j+=width) {//每隔一个格子来取rgb值
    		int rgb=imgarr[i][j];
    		Color color=new Color(rgb);
    		int gray=(color.getRed()+color.getBlue()+color.getGreen())/3;//引入灰度值来判断取0还是1
    		if(gray>150) {
    		    str+="0";//格子颜色为黑色就取0
    		}else {
    			str+="1";
    		}
    	}
    }

    3、将获得的二进码字符串进行类型转换

    int in=Integer.parseInt(str, 2);
    char c=(char)+in;

    4、将获得的字符保存到字符数组中,最后遍历输出字符数组中的字符

    char[] ch=new char[20];//声明一个字符型数组,用来保存转换好的字符
    int t=0;//数组下标
    for(int i=width/2;i<imgarr.length;i+=width) {
    	String str="";//声明字符串
    	for(int j=width/2;j<width*8;j+=width) {//每隔一个格子来取rgb值
    		int rgb=imgarr[i][j];
    		Color color=new Color(rgb);
    		int gray=(color.getRed()+color.getBlue()+color.getGreen())/3;//引入灰度值来判断取0还是1
    		if(gray>150) {
    			str+="0";//格子颜色为黑色就取0
    		}else {
    			str+="1";
    		}
    	}
    	int in=Integer.parseInt(str, 2);
    	char c=(char)+in;
    	ch[t]=c;
    	t++;//每保存一个字符,下标下移
    }
    for(int k=0;k<ch.length;k++) {
    	System.out.print(ch[k]);//输出保存好的字符
    }

    5完整代码

    import java.awt.Color;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.IOException;
    
    import javax.imageio.ImageIO;
    
    public class QRcodedefi {
    	//将二维码图片转为int类型的二维数组
    	public int[][] getpixelarray(String imgpath){
    		BufferedImage img=null;
    		try {
    			img=ImageIO.read(new File(imgpath));//根据路径生成图片
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		//获取图片的宽和高
    		int w=img.getWidth();
    		int h=img.getHeight();
    		
    		int[][] imgarr=new int[w][h];
    		for(int i=0;i<w;i++) {
    			for(int j=0;j<h;j++) {
    				imgarr[i][j]=img.getRGB(i, j);
    			}
    		}
    		return imgarr;
    	}
    	//将获取的二维数组中保存的像素值转为二进制码
    	public void tobinary() {
    		int[][] imgarr= getpixelarray("C:\\Users\\011\\Pictures\\Saved Pictures\\QRcode1.png");
    		int w=imgarr.length;
    		int width=w/20;//格子宽度
    		char[] ch=new char[20];//声明一个字符型数组,用来保存转换好的字符(将得到的二进制码字符串先转为整数再转为字符)
    		int t=0;//数组下标
    		//考虑到可能会取到边界,所以需要改变起点,i、j不是从0取起,从每个矩形中点取起
    		for(int i=width/2;i<imgarr.length;i+=width) {
    			String str="";//声明字符串
    			for(int j=width/2;j<width*8;j+=width) {//每隔一个格子来取rgb值
    				int rgb=imgarr[i][j];
    				Color color=new Color(rgb);
    				int gray=(color.getRed()+color.getBlue()+color.getGreen())/3;//引入灰度值来判断取0还是1
    				if(gray>150) {
    					str+="0";//格子颜色为黑色就取0
    				}else {
    					str+="1";
    				}
    			}
    			int in=Integer.parseInt(str, 2);
    			char c=(char)+in;
    			ch[t]=c;
    			t++;//每保存一个字符,下标下移
    			System.out.println(str+"---"+(char)+in);
    		}
    		for(int k=0;k<ch.length;k++) {
    			System.out.print(ch[k]);//输出保存好的字符
    		}
    	}
    		
    	public static void main(String[]args) {
    		QRcodedefi qrcodedefi=new QRcodedefi();
    		qrcodedefi.tobinary();	
    		
    	}
    }
    

    6、效果图

     

     

    更多相关内容
  • 【二维码】二维码识别

    千次阅读 2022-04-10 10:40:02
    支持各类二维码、条形码等的识别; 多种码混合识别,且红色框线定位; 支持png, jpg, bmp等各种图片格式; 绿色工具免安装,识别效率快准狠。

    一、什么是二维码

    二维码 (2-dimensional bar code),是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的。

    二维条码/二维码可以分为堆叠式/行排式二维条码和矩阵式二维条码。

    1.堆叠式/行排式二维条码,堆叠式/行排式二维条码又称堆积式二维条码或层排式二维条码,其编码原理是建立在一维条码基础之上,按需要堆积成二行或多行。它在编码设计、校验原理、识读方式等方面继承了一维条码的一些特点,识读设备与条码印刷与一维条码技术兼容。但由于行数的增加,需要对行进行判定,其译码算法与软件也不完全相同于一维条码。有代表性的行排式二维条码有:Code 16K、Code 49、PDF417、MicroPDF417 等。

    2.矩阵式二维码,最流行莫过于QR CODE ,我们常说的二维码就是它了。矩阵式二维条码(又称棋盘式二维条码)它是在一个矩形空间通过黑、白像素在矩阵中的不同分布进行编码。在矩阵相应元素位置上,用点(方点、圆点或其他形状)的出现表示二进制“1”,点的不出现表示二进制的“0”,点的排列组合确定了矩阵式二维条码所代表的意义。矩阵式二维条码是建立在计算机图像处理技术、组合编码原理等基础上的一种新型图形符号自动识读处理码制。具有代表性的矩阵式二维条码有:Code One、MaxiCode、QR Code、 Data Matrix、Han Xin Code、Grid Matrix 等。

    二维码在现实生活中的应用越来越普遍由于QR CODE的流行,二维码又称QR code。

    二、二维码识别

     QR Code码,是由日本Denso公司于1994年9月研制的一种矩阵二维码符号,它具有一维条码及其它二维条码所具有的信息容量大、可靠性高、可表示汉字及图象多种文字信息、保密防伪性强等优点。

    1. QR码的基本结构

    QR(Quick-Response) code是被广泛使用的一种二维码,解码速度快。它可以存储多用类型,下图是qrcode的基本结构:

     位置探测图形、位置探测图形分隔符、定位图形:用于对二维码的定位,对每个QR码来说,位置都是固定存在的,只是大小规格会有所差异;
    校正图形:规格确定,校正图形的数量和位置也就确定了;
    格式信息:表示改二维码的纠错级别,分为L、M、Q、H;

    版本信息:即二维码的规格,QR码符号共有40种规格的矩阵(一般为黑白色),从21x21(版本1),到177x177(版本40),每一版本符号比前一版本 每边增加4个模块。

    数据和纠错码字:实际保存的二维码信息,和纠错码字(用于修正二维码损坏带来的错误)。

    2. 二维码检测定位
    1) 寻找二维码的三个角的定位角点,需要对图片进行平滑滤波,二值化,寻找轮廓,筛选轮廓中有两个子轮廓的特征,从筛选后的轮廓中找到面积最接近的3个即是二维码的定位角点。

    2) 判断3个角点处于什么位置,主要用来对图片进行透视校正(相机拍到的图片)或者仿射校正(对网站上生成的图片进行缩放拉伸旋转等操作后得到的图片)。需要判断三个角点围成的三角形的最大的角就是二维码左上角的点。然后根据这个角的两个边的角度差确定另外两个角点的左下和右上位置。

    3) 根据这些特征识别二维码的范围。

    3. 二维码识别即译码

    译码流程:

     

    1. 定位并获取符号图像。深色与浅色模块识别为“ 0”与“1”的阵列。
    2. 识读格式信息(如果需要,去除掩模图形并完成对格式信息模块的纠错,识别纠错等级与掩模图形参考。)
    3. 识读版本信息,确定符号的版本。
    4. 用掩模图形掩模图形参考已经从格式信息中得出对编码区的位图进行异或处理消除掩模。
    5. 根据模块排列规则,识读符号字符,恢复信息的数据与纠错码字。
    6. 用与纠错级别信息相对应的纠错码字检测错误,如果发现错误,立即纠错。
    7. 根据模式指示符和字符计数指示符将数据码字划分成多个部分。
    8. 最后,按照使用的模式译码得出数据字符并输出结果。

    三、二维码识别工具

    绿色工具免安装,识别效率快准狠;
    支持各类二维码、条形码等的识别;
    多种码混合识别,且红色框线定位;
    支持png, jpg, bmp等各种图片格式。

    示例一:识别电子发票中的二维码(这是张全电发票)

    示例二:识别两个二维码,且旋转

    示例三:同时识别二维码和条形码,旋转,倒置,缩小等

     《相关下载和链接》
    二维码识别工具V3.27.exe
    二维码国家标准文档资料

    【二维码】二维码生成
    【二维码】艺术二维码生成

     

     

    展开全文
  • 给定一个既含有ASCII码又含有汉字的字符串,如“abcd今天天气不错”,如何生成其二维码并将获得的二维码识别成该字符串呢?本文章将使用两种方法,生成并识别中英混合编码的二维码

    给定一个既含有ASCII码又含有汉字的字符串,如“abcd今天天气不错”,如何生成其二维码并将获得的二维码识别成该字符串呢?要解决这个问题,首先我们需明白ASCII码和汉字的区别。ASCII码字节数为1,且其对应的二进码字符串首字符都是0,而汉字字节数为2,其对应的二进码字符串首字符可为0也可为1。所以为了区别汉字和ASCII码,我们可以在汉字第一个字节前添加一个由二进码1开头的字节。

    方法一:

    (一)二维码生成:

    思路:获取给定字符串中的每个字符,并将其转为二进制码字符串。根据二进制码字符串的长度来判断字符是汉字还是ASCII码,并对其进行相应的补码操作。若是ASCII码,则补完码后需在其后加两个字节,以保持二维码图形的美观。若是汉字,则补完码后需在第一个字节前加一个由二进制码1开头的字节,以区分汉字和ASCII码。添加相应的字节后,将获得的二进制码字符串保存到数组中。之后对数组中的每个二进制码字符串进行字符遍历,若是‘0’,则设置画笔颜色为白色,若是‘1’,则设置画笔颜色为黑色。最后绘制图片。

    1.获取给定字符串中的每个字符,并将其转为二进制码字符串。

    String str="abcd今天天气不错";
    for(int i=0;i<str.length();i++) {
    			char c=str.charAt(i);//遍历字符串中的每个字符  
    			binarystr=Integer.toBinaryString(c);//将获得的字符转为二进制码字符串
    }

    2.判断字符是汉字还是ASCII码,并对其进行相应的补码操作和添加字节操作。

    if(binarystr.length()<=8) {//ASCII码
    	while(binarystr.length()<8) {//不足8位的在前补0
    		binarystr="0"+binarystr;
    	}
    	binarystr=binarystr+"1001010011010011";//补完码后 凑齐3个字节 保持图形的美观
    }
    else{//汉字
    	while(binarystr.length()<16) {//不足16位在前补0
    		binarystr="0"+binarystr;
    	}
    	binarystr="10010100"+binarystr;//在前补一个字节 该字节首个二进制码为1  用来区分是汉字还是ASCII码
    }

    3.对数组中的每个二进制码字符串进行字符遍历,设置画笔颜色,绘制图形。

    for(int i=0;i<tobinarystr.length;i++) {
    	String str=tobinarystr[i];//获取二进制码字符串数组中的每个二进码字符串
    	for(int j=0;j<str.length();j++) {
    		char c=str.charAt(j);//获取二进制码字符串中的每个字符
            //根据获得的字符进行判断 设置画笔颜色
    		if(c=='0') {
    			g.setColor(Color.WHITE);
    		}else {
    			g.setColor(Color.BLACK);
    		}
    		//绘制图片
    		g.fillRect(100+i*10, 100+j*10, 10, 10);
    	}
    }

    4.完整代码

    QRcodeunion1类:将给定字符串中的每个字符转换为二进制码字符串,并创建保存二进制码字符串的数组。

    public class QRcodeunion1 {
    	String str="abcd今天天气不错";
    	//声明一个字符串数组,用来保存将字符转为二进制码的字符串
    	String[] binarystring=new String[str.length()];
    	//创建方法 将字符串中每个字符(ASCII码或汉字)转为二进制码字符串 返回字符串数组
    	public String[] tobinarystring() {
    		String binarystr;
    		for(int i=0;i<str.length();i++) {
    			char c=str.charAt(i);//遍历字符串中的每个字符  
    			binarystr=Integer.toBinaryString(c);//将获得的字符转为二进制码字符串
    			//判断是汉字还是ASCII码
    			if(binarystr.length()<=8) {//ASCII码
    				while(binarystr.length()<8) {//不足8位的在前补0
    					binarystr="0"+binarystr;
    				}
    				binarystr=binarystr+"1001010011010011";//凑齐3个字节 保持图形的美观
    			}
    			else{//汉字
    				while(binarystr.length()<16) {//不足16位在前补0
    					binarystr="0"+binarystr;
    				}
    				binarystr="10010100"+binarystr;//在前补一个字节 该字节前一位为1  用来区分是汉字还是ASCII码
    			}
    			System.out.println(binarystr);
    			binarystring[i]=binarystr;
    			
    		}	
    	return binarystring;
    	}
    }

    QRcodeunionUI1类:创建二维码窗体界面,绘制二维码

    import java.awt.Color;
    import java.awt.Graphics;
    import javax.swing.JFrame;
    public class QRcodeunionUI1 extends JFrame {
    	private static final long serialVersionUID = 1L;
    	String[] tobinarystr= {};
    	//创建窗体界面
    	public void initUI() {
    		setTitle("二维码");
    		setSize(800,800);
    		setDefaultCloseOperation(EXIT_ON_CLOSE);
    		setVisible(true);
    		Graphics g=getGraphics();
    		paint(g);//调用绘制方法
    	}
    	public void paint(Graphics g) {
    		super.paint(g);
    		//遍历二进制码字符串数组
    		for(int i=0;i<tobinarystr.length;i++) {
    			String str=tobinarystr[i];
    			for(int j=0;j<str.length();j++) {
    				char c=str.charAt(j);
    				if(c=='0') {
    					g.setColor(Color.WHITE);
    				}else {
    					g.setColor(Color.BLACK);
    				}
    				//按行绘制二进制码字符串 按列绘制二进制码字符串中的每个字符
    				g.fillRect(100+i*10, 100+j*10, 10, 10);
    			}
    		}
    	}
    	public static void main(String[]args) {
    		QRcodeunionUI1 qrcodeui=new QRcodeunionUI1();
    		QRcodeunion1  qrcode=new QRcodeunion1();
    		qrcodeui.tobinarystr=qrcode.tobinarystring();//调用QRcodeunion中的方法
    		qrcodeui.initUI();
    	}
    }

    5.效果图

     (二)二维码识别

    思路:将获得的二维码图片转为int类型的二维数组,保存该图片的像素点。根据图片的宽度和方向进行取值,并设置灰度值,从而对灰度值进行判断以获得二进制码字符串。然后根据获得的二进制码字符串中的首个字符来判断是汉字还是ASCII码。若是ASCII码,则只取前8位二进制码字符合成一个二进制码字符串,若是汉字,则只取后16位二进制码字符合成一个二进制码字符串。之后将获得的二进码字符串先转为整数,再转为字符,并保存到字符数组中。最后遍历输出字符数组中的字符。

    1.将获得的二维码图片转为int类型的二维数组,保存该图片的像素点。

    public int[][] getpixelarry(String imgpath){
    		BufferedImage img = null;//先声明图片对象为空
    		try {
    			img=ImageIO.read(new File(imgpath));//根据图片路径生成图片
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		//获取图片的宽和高
    		int w=img.getWidth();
    		int h=img.getHeight();
    		
    		int[][] imgarr=new int[w][h];//定义一个与图片宽高一样的用来保存图片像素点的二维数组
    		
    		for(int i=0;i<w;i++) {
    			for(int j=0;j<h;j++) {
    				imgarr[i][j]=img.getRGB(i, j);
    			}
    		}
    		return imgarr;
    }

    2.根据图片的宽度和方向进行取值,并设置灰度值,从而对灰度值进行判断以获得二进码字符串。

    //考虑到截图边界的问题  每次从格子矩形的中点取起
    		for(int i=width/2;i<w;i+=width) {
    			String str1="";
    			String str2="";
    			for(int j=width/2;j<width*24;j+=width) {//每隔一个格子取
    				int rgb=imgarr[i][j];
    				Color color=new Color(rgb);
    				//设置灰度值
    				int red=color.getRed();
    				int blue=color.getBlue();
    				int green=color.getGreen();
    				int gray=(red+blue+green)/3;
    				//根据灰度值进行判断 获取字符串
    				if(gray<150) {
    					str1+="1";//黑色取1
    				}else {
    					str1+="0";
    				}
    		    }
            }
    

    3.根据所获二进制码字符串中的首个字符来判断是汉字还是ASCII码,从而进行相应的取值操作,获得新的二进码字符串。

    if(str1.charAt(0)=='0') {//ASCII码
    	for(int k=0;k<8;k++) {//只取前8位为一个ASCII码字符的字节
    		str2+=""+str1.charAt(k);//二进制码字符转为二进制码字符串
    	}
    }else {//汉字
    	for(int t=8;t<24;t++) {//后16位为汉字的两个字节
    		str2+=""+str1.charAt(t);	
    	}
    }

    4.将新的二进码字符串先转为整数,再转为字符,并保存到字符数组中。最后遍历输出该数组中的字符。

    int in=Integer.parseInt(str2, 2);//将获取的二进制码字符串转换为整数
    char c=(char)in;//整数转为字符
    ch[m]=c;//将获取的字符保存在字符数组中
    m++;
    for(int k=0;k<ch.length;k++) {
    	System.out.print(ch[k]);//打印输出字符数组
    }

    5.完整代码

    import java.awt.Color;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.IOException;
    import javax.imageio.ImageIO;
    //中英混合二维码识别
    public class QRcodecla {
    	//构建一个方法  返回将二维码图片转为int类型的二维数组
    	public int[][] getpixelarry(String imgpath){
    		BufferedImage img = null;//先声明图片对象为空
    		try {
    			img=ImageIO.read(new File(imgpath));//根据图片路径生成图片
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		//获取图片的宽和高
    		int w=img.getWidth();
    		int h=img.getHeight();
    		
    		int[][] imgarr=new int[w][h];//定义一个与图片宽高一样的用来保存图片像素点的二维数组
    		
    		for(int i=0;i<w;i++) {
    			for(int j=0;j<h;j++) {
    				imgarr[i][j]=img.getRGB(i, j);
    			}
    		}
    		return imgarr;
    	}
    	//创建方法 根据获得的二进制码 生成字符
    	public void tostring() {
    		//获取存有二维码图片像素点数组
    		int[][] imgarr=getpixelarry("C:\\Users\\011\\Pictures\\Saved Pictures\\中英混合QRcode.png");
    		int w=imgarr.length;
    		int width=w/10;//格子宽度
    		char[] ch=new char[10];
    		int m=0;//待输出字符数组的下标
    		//考虑到截图边界的问题  每次从格子矩形的中点取起
    		for(int i=width/2;i<w;i+=width) {
    			String str1="";
    			String str2="";
    			for(int j=width/2;j<width*24;j+=width) {//每隔一个格子取
    				int rgb=imgarr[i][j];
    				Color color=new Color(rgb);
    				//设置灰度值
    				int red=color.getRed();
    				int blue=color.getBlue();
    				int green=color.getGreen();
    				int gray=(red+blue+green)/3;
    				//根据灰度值进行判断
    				if(gray<150) {
    					str1+="1";//黑色取1
    				}else {
    					str1+="0";
    				}
    			}
    			//根据获得二进制码字符串中的首个字符判断是汉字还ASCII码
    			if(str1.charAt(0)=='0') {//ASCII码
    				for(int k=0;k<8;k++) {//只取前8位为一个ASCII码字符的字节
    					str2+=""+str1.charAt(k);//二进制码字符转为二进制码字符串
    				}
    			}else {//汉字
    				for(int t=8;t<24;t++) {//后16位为汉字的两个字节
    					str2+=""+str1.charAt(t);	
    				}
    			}
    			int in=Integer.parseInt(str2, 2);//将获取的二进制码字符串转换为整数
    			char c=(char)in;//整数转为字符
    			System.out.println(str2+"---"+c);
    			ch[m]=c;//将获取的字符保存到字符数组中
    			m++;
    		}
    		for(int k=0;k<ch.length;k++) {
    			System.out.print(ch[k]);//打印输出字符数组
    		}
    	}
    	public static void main(String[]args) {
    		QRcodecla qrcode=new QRcodecla();
    		qrcode.tostring();
    	}
    
    }

    6.效果图

     

     方法二:

    (一)二维码生成

    思路:获取给定字符串中的每个字符,并将其转为二进制码字符串。根据二进制码字符串的长度来判断字符是汉字还是ASCII码,并对其进行相应的补码操作。若是汉字,补完码后还需在第一个字节前添加一个由二进制码1开头的字节,以区分ASCII码和汉字。并将所有获得的二进制码字符串合成一个新的二进制码字符串。由于新获得的二进制码字符串共有176位二进制码,所以在对新获得的二进码字符串进行字符遍历时,需借助一个计数器,每隔16个字符将计数器设置为0。这样就可以巧妙地设置坐标,使绘制出的图形美观。

    1.获取给定字符串中的每个字符,并将其转为二进制码字符串。

    String str="abcd今天天气不错";
    String binarystr;
    for(int i=0;i<str.length();i++) {
    	char c=str.charAt(i);//遍历字符串中的每个字符  
    	binarystr=Integer.toBinaryString(c);//将获得的字符转为二进制码字符串

    2.判断字符是汉字还是ASCII码,并对其进行相应的补码和添加字节操作。之后将所有获得的二进制码字符串合成一个新的二进制码字符串。

    //声明一个字符串,用来保存将字符转为二进制码的字符串
    String binarystring="";
    if(binarystr.length()<=8) {//ASCII码
    	while(binarystr.length()<8) {//不足8位的在前补0
    		binarystr="0"+binarystr;
    	}
    }
    else{//汉字
    	while(binarystr.length()<16) {//不足16位在前补0
    		binarystr="0"+binarystr;
    	}
    	binarystr="10010100"+binarystr;//在前补一个字节 该字节第一位为1  用来区分是汉字还是ASCII码
    }
    binarystring+=binarystr;

    3.对新获得的二进码字符串进行字符遍历,设置画笔颜色,并巧妙地设置坐标。

    for(int i=0;i<tobinarystr.length();i++) {
    	//每列绘制指定二进制码字符串中的一个字符  设置一个计数器count  
    	//将所获得的新二进制码字符串每取16个字符 即每隔16个字符将计数器设置为0  
    	if(count==16) {
    		count=0;
    	}
    	char c=tobinarystr.charAt(i);
    	if(c=='0') {
    	    g.setColor(Color.WHITE);
    	}else {
    		g.setColor(Color.BLACK);
    	}
    	//按行绘制二进制码字符串 按列绘制二进制码字符串中的每个字符 这样每行有11个格子 每列有16个格子
    	g.fillRect(100+i/16*10, 100+count*10, 10, 10);//格子的宽度和高度都为10
    	count++;
    }

    4.完整代码

    QRcodeunion2类:将给定字符串中的每个字符转换为二进制码字符串,并将这些二进制码字符串合成一个新的二进制码字符串。

    public class QRcodeunion2 {
    	String str="abcd今天天气不错";
    	//声明一个字符串,用来保存将字符转为二进制码的字符串
    	String binarystring="";
    	//创建方法 将字符串中每个字符(ASCII码或汉字)转为二进制码字符串 返回字符串数组
    	public String tobinarystring() {
    		String binarystr;
    		for(int i=0;i<str.length();i++) {
    			char c=str.charAt(i);//遍历字符串中的每个字符  
    			binarystr=Integer.toBinaryString(c);//将获得的字符转为二进制码字符串
    			//判断是汉字还是ASCII码
    			if(binarystr.length()<=8) {//ASCII码
    				while(binarystr.length()<8) {//不足8位的在前补0
    					binarystr="0"+binarystr;
    				}
    			}
    			else{//汉字
    				while(binarystr.length()<16) {//不足16位在前补0
    					binarystr="0"+binarystr;
    				}
    				binarystr="10010100"+binarystr;//在前补一个字节 该字节第一位为1  用来区分是汉字还是ASCII码
    			}
    			System.out.println(binarystr);
    			binarystring+=binarystr;	
    		}	
    		return binarystring;
    	}
    }

    QRcodeunionUI2类:创建窗体界面,绘制二维码

    import java.awt.Color;
    import java.awt.Graphics;
    import javax.swing.JFrame;
    public class QRcodeunionUI2 extends JFrame {
    	private static final long serialVersionUID = 1L;
    	QRcodeunion2  qrcode2=new QRcodeunion2();//调用QRcodeunion2中的方法
    	String tobinarystr=qrcode2.tobinarystring();
    	//创建窗体界面
    	public void initUI() {
    		setTitle("二维码");
    		setSize(800,800);
    		setDefaultCloseOperation(EXIT_ON_CLOSE);
    		setVisible(true);
    		Graphics g=getGraphics();
    		paint(g);//调用绘制方法
    	}
    	public void paint(Graphics g) {
    		super.paint(g);
    		//遍历字符串
    		int count=0;
    		for(int i=0;i<tobinarystr.length();i++) {
    			//每列绘制指定字符串中的一个字符  设置一个计数器count  
    			//将所获得的二进制码字符串每取16个字符 即每隔16个字符将计数器设置为0  
    			if(count==16) {
    				count=0;
    			}
    			char c=tobinarystr.charAt(i);
    			if(c=='0') {
    				g.setColor(Color.WHITE);
    			}else {
    				g.setColor(Color.BLACK);
    			}
    			//按行绘制二进制码字符串 按列绘制二进制码字符串中的每个字符 这样每行有11个格子 每列有16个格子
    			g.fillRect(100+i/16*10, 100+count*10, 10, 10);//格子的宽度和高度都为10
    			count++;
    		}
    	}
    	public static void main(String[]args) {
    		QRcodeunionUI2 qrcodeui=new QRcodeunionUI2();
    		qrcodeui.initUI();
    	}
    }

    5.效果图

     (二)二维码识别

    思路:将获得的二维码图片转为int类型的二维数组,保存该图片的像素点。根据图片的宽度和方向进行取值,并设置灰度值,从而对灰度值进行判断以获得二进制码字符串。从获得的二进制码字符串中截取需转为ASCII码字符或中文字符的二进制码字符串子串,将其保存到字符串数组中。遍历数组中二进制码字符串,将其转为对应的字符,并输出该字符。

    1.将获得的二维码图片转为int类型的二维数组,保存该图片的像素点。

    public int[][] getpixelarry(String imgpath){
    	BufferedImage img = null;//先声明图片对象为空
    	try {
    	    img=ImageIO.read(new File(imgpath));//根据图片路径生成图片
    	} catch (IOException e) {
    		// TODO Auto-generated catch block
    		e.printStackTrace();
    	}
    	//获取图片的宽和高
    	int w=img.getWidth();
    	int h=img.getHeight();	
    	int[][] imgarr=new int[w][h];//定义一个与图片宽高一样的用来保存图片像素点的二维数组		
    	for(int i=0;i<w;i++) {
    		for(int j=0;j<h;j++) {
    			imgarr[i][j]=img.getRGB(i, j);
    		}
    	}
    	return imgarr;
    }

    2.根据图片的宽度和方向进行取值,并设置灰度值,从而对灰度值进行判断以获得二进制码字符串。

    for(int i=width/2;i<w;i+=width) {//每隔一个格子进行取值
    	for(int j=width/2;j<16*width;j+=width) {//每列有16个格子
    	    int rgb=imgarr[i][j];
    		Color color=new Color(rgb);
            //取灰度值进行判断
    		int red=color.getRed();
    		int green=color.getGreen();
    		int blue=color.getBlue();
    		int gray=(red+green+blue)/3;
    		if(gray<150) {
    			str1+="1";
    		}else {
    			str1+="0";
    		}
    	}
    }

    3.截取需转为ASCII码字符或中文字符的二进制码字符串子串,将其保存到字符串数组中。

    int k=0;
    while(k<4) {//从二维码图可知,前四个字符为ASCII码
    	str2[k]="";//数组中的每个字符串需初始化
    	for(int m=k*8;m<8*(1+k);m++) {//每隔8个二进制码取值
    		str2[k]+=str1.charAt(m);
    	}
    	k++;
    }
    while(4<=k&&k<10) {//后六个字符为中文
    	str2[k]="";
    	for(int n=40+24*(k-4);n<32+24*(k-3);n++) {//每隔16个二进制码取值 
    		str2[k]+=str1.charAt(n);
    	}
    	k++;
    }

    4.遍历数组中二进制码字符串,将其转为对应的字符,并输出该字符。

    for(int t=0;t<str2.length;t++) {
    	int in=Integer.parseInt(str2[t], 2);
    	char c=(char)in;
    	System.out.print(c);
    }

    5.完整代码

    import java.awt.Color;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.IOException;
    import javax.imageio.ImageIO;
    public class QRcodecla2 {
    	//构建一个方法  返回将二维码图片转为int类型的二维数组
    		public int[][] getpixelarry(String imgpath){
    			BufferedImage img = null;//先声明图片对象为空
    			try {
    				img=ImageIO.read(new File(imgpath));//根据图片路径生成图片
    			} catch (IOException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    			//获取图片的宽和高
    			int w=img.getWidth();
    			int h=img.getHeight();
    			int[][] imgarr=new int[w][h];//定义一个与图片宽高一样的用来保存图片像素点的二维数组
    			for(int i=0;i<w;i++) {
    				for(int j=0;j<h;j++) {
    					imgarr[i][j]=img.getRGB(i, j);
    				}
    			}
    			return imgarr;
    		}
    		public void tostring() {
    			int[][] imgarr=getpixelarry("C:\\Users\\011\\Pictures\\Saved Pictures\\中英混合2.png");
    			int w=imgarr.length;
    			int width=w/11;//格子宽度(一行由11个黑白格子组成)
    			String str1="";//定义保存由灰度值判断的二进制码
    			String[] str2=new String[10];//定义保存待转换字符的二进制码字符串
    			//考虑到截图边界的问题  每次从格子矩形的中点取起
    			for(int i=width/2;i<w;i+=width) {
    				for(int j=width/2;j<16*width;j+=width) {
    					int rgb=imgarr[i][j];
    					Color color=new Color(rgb);
    					//取灰度值进行判断
    					int red=color.getRed();
    					int green=color.getGreen();
    					int blue=color.getBlue();
    					int gray=(red+green+blue)/3;
    					if(gray<150) {
    						str1+="1";
    					}else {
    						str1+="0";
    					}
    				}
    			}
    			//从str1中截取需转为ASCII码字符(8bit)或中文字符(16bit)的二进制码字符串
    			//保存到数组中
    			int k=0;
    			while(k<4) {//从中英混合二维码图可知,前四个字符为ASCII码
    				str2[k]="";//数组中的每个字符串需初始化
    				for(int m=k*8;m<8*(1+k);m++) {//每隔8个二进制码取值
    					str2[k]+=str1.charAt(m);
    				}
    				k++;
    			}
    			while(4<=k&&k<10) {//后六个字符为中文
    				str2[k]="";
    				for(int n=40+24*(k-4);n<32+24*(k-3);n++) {//每隔16个二进制码取值
    					str2[k]+=str1.charAt(n);
    				}
    				k++;
    			}
    			//打印输出二进制码字符串及其所代表的字符
    			for(int t=0;t<str2.length;t++) {
    				int in=Integer.parseInt(str2[t], 2);
    				char c=(char)in;
    				System.out.println(str2[t]+"---"+c);
    			}
    			//打印输出识别后的二维码字符串
    			for(int t=0;t<str2.length;t++) {
    				int in=Integer.parseInt(str2[t], 2);
    				char c=(char)in;
    				System.out.print(c);
    			}
    		}
    		//程序入口
    		public static void main(String[]args) {
    			QRcodecla2 qrcodecla2=new QRcodecla2();
    			qrcodecla2.tostring();
    		}
    }

    6.效果图

     

    展开全文
  • 就一张二维码图片,用一些在线工具识别是乱码,用QQ...用16进制编辑器打开发现末尾有段很突兀的数据,不属于bmp位图的内容,想必flag就在其中 观察这段数据发现只有0-7,没有8和9,很容易想到是8进制数据...

    题目地址:http://ctf.bugku.com/files/5e480ecb178711e82bc847a208e15b32/misc80.zip

     

    就一张二维码图片,用一些在线工具识别是乱码,用QQ识别出来是

     

    用16进制编辑器打开发现末尾有段很突兀的数据,不属于bmp位图的内容,想必flag就在其中

     

    观察这段数据发现只有0-7,没有8和9,很容易想到是8进制数据,可以将其转换成10进制,然后再转成ascii字符。一开始看这个数字总长126个,2的倍数,加上以前转换16进制的惯性思维,让我以为这里也是两两一对的转换,转换出来自然不正确,一堆乱码,后来发现两位的8进制数据最大077(数字前加0表示8进制),转换成10进制63也表示不完ascii码表上的字符啊,而且126刚好也是3的倍数,所以三个一组来转换,如下脚本:

    f=open("1.txt",'r')
    res=''
    for i in range(42):
        s=eval('0'+f.read(3))
        res+=chr(int(s))
    print res   
    raw_input()

     

    转载于:https://www.cnblogs.com/leixiao-/p/9825703.html

    展开全文
  • 基于Python的二维码实验一、机器视觉之QRcode二、基于Python的QRcodetest(一)配置环境(二)生成自己的二维码(三)识别二维码三、调用opencv库摄像头识别图像(一)用opencv找出(条形码&二维码)位置(二)调用...
  • [Halcon&识别] 二维码识别

    万次阅读 多人点赞 2019-07-01 15:46:21
    一、二维码概念:         指在一维条码的基础上扩展出另一维具有可读性的条码,使用黑白矩形图案表示二进制数据,被设备扫描后可获取其中所包含的信息。一维条码的宽度记载着数据,而其长度...
  • 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的新项目是python+opencv+深度学习实现二维码识别学长这里给一个题目综合评分(每项满分5分)难度系数3分工作量。...
  • 这两年开始毕业设计和...为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是 python+opencv+深度学习实现二维码识别学长这里给一个题目综合评分(每项满分5分) 选题指导, 项目分享:...
  • 基于MATLAB的条码二维码识别系统

    千次阅读 2021-09-08 11:53:15
    基于MATLAB的条码二维码识别系统课题介绍 本设计研究的是基于数字图像处理的EAN-13条形码识别算法,通过工具平台MATLAB实现。其中图像处理部分是条码识别重要的前期工作,利用MATLAB强大的图象处理工具箱实现图像的...
  • /****************************************************** 文件名 :main.cpp 描 述 :条形码,二维码识别 语 言 : 作 者 :范泽华 修 改 : 日 期 :2018-05-19 说 明 :需要Zbar的支持 ****************************...
  • 二维码识别

    千次阅读 2018-12-06 09:58:10
    版权声明:本文为博主原创文章,未经博主允许不得转载。...二维码 (2-dimensional bar code),是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的。 在许多种类...
  • halcon二维码识别

    千次阅读 2019-10-18 14:57:55
    由一组规则排列的条、空以及对应的字符组成的标记,“条”指对光线反射率较低的部分,“空”指对光线反射率较高的部分,这些条和空组成的数据表达一定的信息,并能够用特定的设备识读,转换成与计算机兼容的二进制和...
  • 二维码识别zxing 包下载地址解析清晰二维码ImageLuminanceSource实现完整的调用方法稍微模糊的二维码ORCodeImageUtil (以jdk1.8为例) zxing 包下载地址 地址: https://repo1.maven.org/maven2/com/google/zxing/...
  • java实现识别二维码图片功能

    千次阅读 多人点赞 2020-09-18 18:12:13
    java实现识别二维码图片功能 所需maven依赖 <dependency> <groupId>com.google.zxing</groupId> <artifactId>javase</artifactId> <version>3.2.1</version> </...
  • 由一组规则排列的条、空以及对应的字符组成的标记,“条”指对光线反射率较低的部分,“空”指对光线反射率较高的部分,这些条和空组成的数据表达一定的信息,并能够用特定的设备识读,转换成与计算机兼容的二进制和...
  • java代码生成可识别二维码 当今社会对于二维码的使用极其广泛,二维码可以由很多方式获得, 其中的一种方式是使用java代码生成,Java操作二维码的开源项目有很多,如 SwetakeQRCode,BarCode4j,Zxing等等。本文将...
  • 在三个定位符的情况下,二维码的数据识别是从没有定位符的右下角进行的,因此只有3个定位符的时候才能准确定义一个二维码识别方向(如下图);4个定位符不行,因为它4个角都长一个样;两个定位符也不行,因为另外两...
  • Android二维码原理与优化方向

    万次阅读 多人点赞 2020-03-03 16:37:31
    做过Android的二维码扫描的童鞋可能会遇到过,很多二维码识别不了,或者识别速度慢。一般造成这个识别不出来的原因,大概以下几点: Android手机配置不一样,手机像素高低也有不同,有的手机还不支持自动对焦 环境...
  • 若该文为原创文章,未经允许不得转载 原博主博客地址:... 目录 前话 Demo Demo测试下载地址 ...二维码 简介 涉及应用功能 一维条形码与二维码 二维码种类 堆叠式/行排式 矩阵式二...
  • 由一组规则排列的条、空以及对应的字符组成的标记,“条”指对光线反射率较低的部分,“空”指对光线反射率较高的部分,这些条和空组成的数据表达一定的信息,并能够用特定的设备识读,转换成与计算机兼容的二进制和...
  • 二维码生成原理及解析代码

    万次阅读 多人点赞 2017-12-18 22:35:06
    二维码生成原理及解析代码 自从大街小巷的小商小贩都开始布满了腾讯爸爸和阿里爸爸的二维码之后,我才感觉到我大天朝共享支付的优越性。最近毕业论文写的差不多了,在入职之前多学一些东西也是好的。这里秉着好奇心...
  • java开发,公司最近需要在对凭证识别的过程中加入二维码识别,在网上搜索后,选定了两款开源工具,分别是谷歌的ZXING,以及QRcode,但本地测试后发现,QRcode相对于ZXING效果还是要差一点。但ZXING主要还是针对移动端...
  • ImageMagic+zbar 二维码识别分析-zbarimg

    千次阅读 2020-05-09 14:27:40
    zbar 源码中已经列出了 二维码、条形码图片识别程序,zbarimg 这里加入了一些说明,并单独进行编译测试 zbarimg.c #include <config.h> #include <stdlib.h> #include <stdio.h> #include <...
  • 今天讲一下目前移动领域很常用的技术——...今天主要是讲解如何使用 ZXing库,生成和识别二维码。这篇文章实用性为主,理论性不会讲解太多,有兴趣可以自己查看源码。 1、ZXing库介绍  这里简单介绍一下ZX...
  • 浅析二维码基本原理

    万次阅读 2020-10-21 16:08:01
    识别技术的发展可以分为三个阶段:自然识别阶段、模式识别阶段、自动识别阶段。自然识别主要是通过人的感官来识别物体。随着科技的发展,人的感官认识能力逐渐的被机器模拟出来。模式识别是对物体的直观信息进行读取...
  • 模板网站防盗js,16进制码破解

    千次阅读 2018-06-04 22:31:22
    1.将头部用var声明的js16进制码数组摘取出来。2.新建一个html页面,注入以下代码,并将摘取的var数组放置在里面。 function decode() { var element = document.getElementById('code'); for (var key in _0xf488)...
  • 二维码编码规范解读

    千次阅读 2021-10-16 11:27:48
    二维码
  • 二维码检测定位

    千次阅读 2021-07-27 13:10:58
    条码 条码分为一维条码、二维条码和三维条码。 一维条码(Bar Code) 一维条码是由一组粗细不同、黑白(或彩色)相间...二维条码简称为二维码,是用某站特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,129
精华内容 1,251
热门标签
关键字:

二维码识别16进制