目录
1.创建路径以存储图片
2.二维码保存
2.1.代码完善
2.2.运行结果
3.二维码读取
3.1.功能要求
3.2.代码
上一篇博客中介绍了二维码的生成原理,那么怎么将二维码保存到电脑中并能够识别呢
通过这篇博客我们学习如何将我们生成的二维码保存并识别。
1.创建路径以存储图片
我们可以在项目下创建一个Directory文件以方便在代码中保存和读取图片
这里将其命名为img,我们可以将电脑中的图片复制到该文件下,也可以在代码中将该路径作为保存图片或读取图片的地址
通过以上步骤可以快速获取图片地址并调用
2.二维码保存
2.1.代码完善
public void actionPerformed(ActionEvent e) {
String btnText=e.getActionCommand();//获取按钮文本
String textStr=text.getText();获取输入框文本
if(btnText.equals("生成二维码")){
String[] codeArr=strToBinarys(textStr);
BufferedImage img=new BufferedImage(codeArr.length*25,16*25,2);
Graphics bg=img.getGraphics();
for(int i=0;i<codeArr.length;i++){
for(int j=0;j<codeArr[i].length();j++){
char ch=codeArr[i].charAt(j);
if(ch=='0'){
bg.setColor(Color.white);
}else if(ch=='1'){
bg.setColor(Color.black);
}
bg.fillRect(i*25,j*25,25,25);
}
}
//将二维码的边框标红
g.setColor(Color.red);
g.fillRect(99,99,img.getWidth()+2,img.getHeight()+2);
g.drawImage(img,100,100,null);
try {
ImageIO.write(img, "PNG", new File("img/qrcode.png"));//将图片保存到指定路径
} catch (IOException m) {
throw new RuntimeException(m);
}
}
2.2.运行结果
3.二维码读取
3.1.功能要求
*从给定路径读取图片,并保存在数组中
*从数组中遍历像素值,并将黑白像素值转换为10,存储在二进制字符串中
*将二进制字符串中的二进制码码转换为字符串并输出
3.2.代码
package com.lht1220;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
public class QRCodeReader {
public void getImagePixels(String path){
File file=new File(path);
try {
BufferedImage img= ImageIO.read(file);//加载图片
int w=img.getWidth();//宽度
int h=img.getHeight();//高度
int size=h/16;//根据高度/每个字符16位二进制码得到每个黑白方框的边长
int strLength=w/size;//图片宽度/边长得到字符串长度
int[][] arr=new int[w][h];//创建二维数组存储图片各像素像素值
//遍历像素
for(int i=0;i< arr.length;i++){
for(int j=0;j<arr[0].length;j++){
arr[i][j]=img.getRGB(i,j);
}
}
String codeStr="";//存储二进制字符串
//根据黑白方块的边长读取每个黑白方块的像素值
for(int i=size/2;i< arr.length;i+=size){
for(int j=size/2 ;j<arr[0].length;j+=size){
int rgb=arr[i][j];
int red=(rgb>>16)&255;
int green=(rgb>>8)&255;
int blue=rgb&255;
int gray=(red+green+blue)/3;//计算灰度值
if(gray<255/2){
codeStr+='1';//偏黑标记为1
}else{
codeStr+='0';
}
}
}
String str="";//存储二维码结果的字符串
String str16="";//存储每个字符二进制编码的字符串
//遍历二进制字符串
for(int i=0;i<codeStr.length();i++){
char ch=codeStr.charAt(i);//取出01字符
str16+=ch;//存入
//如果str16中存入16个01字符,则将其转为字符并存入str中
if(i!=0&&i%16==15){
int bi=Integer.parseInt(str16,2);//将字符串格式转为二进制格式
str+=(char)bi;//将二进制转为字符
str16="";//清空以便处理下一个字符
}
}
System.out.println(str);//输出结果
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public static void main(String[] args) {
new QRCodeReader().getImagePixels("img/qrcode.png");
}
}
3.3.运行结果
读取二维码中数据并输出