java学习—二维码识别

目录

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

以上代码与上一篇博客中代码原理相同,仅增加了边框标红与图片保存功能,详细可见上一篇博客

java学习--简单二维码生成

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.运行结果

读取二维码中数据并输出

  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Java实现二维码识别需要使用第三方库,如zxing(Zebra Crossing),这是一个开源的条形码和二维码处理库。 以下是使用zxing实现二维码识别的步骤: 1. 引入zxing库 在项目中引入zxing库,可以通过Maven或手动下载jar包的方式引入。 2. 读取二维码图片 使用Java的ImageIO类读取二维码图片,将其转换为BufferedImage对象。 ``` File file = new File("path/to/qrcode.png"); BufferedImage image = ImageIO.read(file); ``` 3. 解码二维码 使用zxing库的MultiFormatReader类解码二维码。 ``` MultiFormatReader reader = new MultiFormatReader(); Result result = reader.decode(new BinaryBitmap(new HybridBinarizer(new BufferedImageLuminanceSource(image)))); String qrCodeText = result.getText(); ``` 4. 获取二维码内容 解码成功后,可以通过getResult().getText()方法获取二维码内容。 完整代码示例: ``` import java.awt.image.BufferedImage; import java.io.File; import javax.imageio.ImageIO; import com.google.zxing.BinaryBitmap; import com.google.zxing.MultiFormatReader; import com.google.zxing.Result; import com.google.zxing.client.j2se.BufferedImageLuminanceSource; import com.google.zxing.common.HybridBinarizer; public class QRCodeReader { public static void main(String[] args) { try { File file = new File("path/to/qrcode.png"); BufferedImage image = ImageIO.read(file); MultiFormatReader reader = new MultiFormatReader(); Result result = reader.decode(new BinaryBitmap(new HybridBinarizer(new BufferedImageLuminanceSource(image)))); String qrCodeText = result.getText(); System.out.println("QR Code Text: " + qrCodeText); } catch (Exception e) { System.out.println("Error: " + e.getMessage()); } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

.山高人为峰.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值