一、二维码生成

思路:将字符串中的每个字符转为二进制码字符串,保存在二进制码字符串数组中。对二进制码字符串数组中的每个二进制码字符串进行字符遍历,若是‘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的前面补0while(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的前面补0while(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 blocke.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还是1if(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还是1if(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 blocke.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还是1if(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、效果图

Java—二维码生成与识别(一)相关推荐

  1. java二维码生成 使用SSM框架 搭建属于自己的APP二维码合成、解析、下载

    java二维码生成 使用SSM框架 搭建属于自己的APP二维码合成.解析.下载 自己用java搭建一个属于自己APP二维码合成网站.我的思路是这样的: 1.用户在前台表单提交APP的IOS和Andro ...

  2. python识别发票二维码_Python 实现二维码生成和识别

    今天突然想给自己自己做个头像,然后还是二维码的形式,这样只要扫一扫就可以访问我的主页.然后就开始自己的苦逼之路... 其实实现二维码java,c#,C++等都可以实现:由于自己正在学python,所以 ...

  3. java二维码生成-谷歌(Google.zxing)开源二维码生成学习及实例

    java二维码生成-谷歌(Google.zxing)开源二维码生成的实例及介绍  这里我们使用比特矩阵(位矩阵)的QR码编码在缓冲图片上画出二维码 实例有以下一个传入参数 OutputStream o ...

  4. 【二维码识别】基于matlab GUI灰度+二值化+校正二维码生成与识别【含Matlab源码 635期】

    ⛄一.二维码生成与识别简介 如今,移动互联网技术日新月异,随着5G时代的来临,广泛应用于数据处理过程中的二维码信息安全日益成为人们越来越关注的问题.以QR码为代表的二维码,以其在信息存储.传输和识别技 ...

  5. 【二维码识别】灰度+二值化+校正二维码生成与识别【含GUI Matlab源码 635期】

    ⛄一.二维码生成与识别简介 如今,移动互联网技术日新月异,随着5G时代的来临,广泛应用于数据处理过程中的二维码信息安全日益成为人们越来越关注的问题.以QR码为代表的二维码,以其在信息存储.传输和识别技 ...

  6. python 二维码生成与识别

    python 二维码生成与识别 1.生成二维码 1.1 qrcode 安装qrcode模块 pip install qrcode 示例: # author:mlnt# createdate:2022/ ...

  7. Qt开发二维码工具QR二维码生成和识别支持批量生成免费使用

    简介 Qt编写,使用第三方库libqrencode和QZxing,支持QR二维码生成和识别,二维码可批量生成,支持中文,还可以设置二维码大小颜色.免费使用,下载链接在本文底部,拿走不用谢,假如您慷慨大 ...

  8. 【笔记11】uniapp点击复制;mysql数据库存储emoji表情;Java 二维码生成;uniapp引入自定义图标

    目录 前言 一.uniapp 实现点击复制某段文本 二.MySQL 数据库存储 emoji 表情 三.Layui 的富文本编辑器 四.谷歌 Java 二维码生成 (1) 引入 MAVEN 依赖 五.微 ...

  9. Android 二维码 生成和识别

    今天讲一下目前移动领域很常用的技术--二维码.现在大街小巷.各大网站都有二维码的踪迹,不管是IOS.Android.WP都有相关支持的软件.之前我就想了解二维码是如何工作,最近因为工作需要使用相关技术 ...

最新文章

  1. 开闭鸿蒙都只为风味情浓,开辟鸿蒙,谁为情种?都只为风月情浓。
  2. python创意小作品代码-Python学习,给自己的代码做个合集,定制自己的桌面软件!...
  3. 万网控制面板 php_UPUPW 控制面板启动关闭区介绍
  4. Jenkins Job Buidler
  5. apache.camel_带有Spring Boot 2支持的Apache Camel 2.22发布
  6. 关于Linq to SQL 的“异常详细信息: System.InvalidCastException: 指定的转换无效。”
  7. 消息轨迹全景图详解-独门秘籍
  8. jquery 表格自动拆分(方便打印)插件-printTable
  9. github java开源项目经验_Java 开源项目 GitHub 趋势周报 20201230
  10. (转)十分钟入门pandas
  11. 期货市场技术分析05_交易量和持仓兴趣
  12. 第四回. 实数系的性质
  13. Python基础教程(入门教程),30分钟玩转Python编程!
  14. windows 可以当镜子用的软件
  15. 计算流体力学基础与网格概述(与书同行)——ANSYS ICEM CFD网格划分从入门到精通——丁源
  16. 数据库面试题SQL篇
  17. 这样的男人有几个;1.会为你哭的男人2.喜欢欺负你的男人3.会主动亲你的男人4.喜欢叫你傻瓜
  18. 数据解读:都知道《隐秘的角落》火了,它到底怎么火的?
  19. r语言知识点(课件)
  20. 安装Google代理管理

热门文章

  1. ORA-25156: 旧样式的外部联接 (+) 不能与 ANSI 联接一起使用
  2. 实现文本框以及其背景(根据输入字数)动态拉伸
  3. methodinvocationexception: property ‘driverclassname‘ threw exception; nested exception is java.lang
  4. Ansible Inventory内置参数
  5. 2021个人年度总结
  6. 网易新闻iOS版使用的18个开源组件
  7. exo文件_eXo平台概述
  8. 墨者安全调查:2018年DDoS威胁与黑灰产业调查报告
  9. 看漫画学焊接!5分钟教你电烙铁的焊接方法
  10. COGS 2482. Franky的胡子【二分,高精度】