文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

python调用zxing项目进行二维码

2023-01-31 05:19

关注

摘要:首先创建一个java的maven项目,加入zxing相关包,编写二维码相关代码,调试运行,打包;然后创建一个python项目,安装jpype,编写代码把相关的jar包加载,运行。

0. 创建一个maven项目

1. 配置pom.xml文件

<!-- https://mvnrepository.com/artifact/com.google.zxing/core -->
        <dependency>
            <groupId>com.google.zxing</groupId>
            <artifactId>core</artifactId>
            <version>3.3.0</version>
        </dependency>

        <dependency>
            <groupId>com.google.zxing</groupId>
            <artifactId>javase</artifactId>
            <version>3.0.0</version>
        </dependency>

         <dependency>  
            <groupId>com.alibaba</groupId>  
            <artifactId>fastjson</artifactId>  
            <version>1.1.29</version>  
        </dependency> 

2. 生成与识别二维码###

import java.io.File;
import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.Path;
import java.util.HashMap;
import java.util.Map;

import javax.imageio.ImageIO;

import com.alibaba.fastjson.JSONObject;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.DecodeHintType;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.NotFoundException;
import com.google.zxing.Result;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;

public class QRCode {

    public static void main(String[] args) {
        QRCode qrcode = new QRCode();
        // 内容
        JSONObject json = new JSONObject();
        json.put("blog", "http://blog.csdn.net/ld326");
        json.put("author", "happyprince");
        String content = json.toJSONString();
        // 生成二维码
        qrcode.EncodeQR("D:\\info-qr.png", content, 200, 200, "png");
        // 解释二维码
        boolean b = qrcode.DecodeQR("D:\\info-qr.png");
        if (b) {
            System.out.println("解釋出來是二維碼!!!");
        }

    }

    
    public void EncodeQR(String filePath, String content, int width,
            int height, String format) {
        Map<EncodeHintType, Object> hints = new HashMap<EncodeHintType, Object>();
        hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
        try {
            // 生成矩阵
            BitMatrix bitMatrix = new MultiFormatWriter().encode(content,
                    BarcodeFormat.QR_CODE, width, height, hints);
            // 输出图像
            Path path = FileSystems.getDefault().getPath(filePath);
            System.out.println(path);
            MatrixToImageWriter.writeToPath(bitMatrix, format, path);
        } catch (WriterException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println("生成二维码成功.");
    }

    
    public boolean DecodeQR(String filePath) {
        boolean b = false;
        try {
            // 读入图片,转化成位图
            BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(
                    new BufferedImageLuminanceSource(ImageIO.read(new File(
                            filePath)))));

            // 设置额外的一些信息,例如读取入来的提示信息
            Map<DecodeHintType, Object> hints = new HashMap<DecodeHintType, Object>();
            hints.put(DecodeHintType.CHARACTER_SET, "UTF-8");

            // 对图像进行解码
            Result result = new MultiFormatReader().decode(binaryBitmap, hints);
            // 打印信息
            // sb.append("content:  " + result.getText() + " ");
            // sb.append("format:  " + result.getBarcodeFormat() + " ");
            b = true;
        } catch (IOException e) {
            // sb.append(e + " " + "filePath=" + filePath);
            e.printStackTrace();

        } catch (NotFoundException e) {
            // sb.append(e + " " + "filePath=" + filePath);
            e.printStackTrace();
        }
        return b;
    }
}

3. 打包

生成qrcode包,命名为qrcode-1.0.0.jar;再把maven下载的两个包(javase-3.0.0.jar,core-3.3.0.jar)与这个包放在一起,一会会把这些包加载到jvm中运行。

4. 安装jpype

目前配置的是win7,下载地址:http://www.lfd.uci.edu/~gohlke/pythonlibs/#jpype

5. 创建python项目

编写python代码

# -*- coding: utf-8 -*-
import logging

from jpype import *

from common.globalVars import JAR_PATH

@singleton
class QRCode:
    """
        判断图片是否QR图片
    """

    def __init__(self):
        logging.info('starJVM..')
        startJVM(getDefaultJVMPath(), "-ea", "-Djava.class.path=%s;%s;%s" % (
            JAR_PATH + 'core-3.3.0.jar',
            JAR_PATH + 'javase-3.0.0.jar',
            JAR_PATH + 'qrcode-1.0.0.jar'
        ))
        QRCode = JClass("com.lr.jpype.jpype.QRCode")
        self.qr = QRCode()

    def is_qrcode(self, file_name):
        b = self.qr.DecodeQR(file_name)
        return b
    def __del__(self):
        shutdownJVM()
        logging.info('shutdownJVM..')
qrc = QRCode()
print(qrc.is_qrcode('d:/1.jpg'))

其中装饰类,为了完成单例的功能

import logging
def singleton(cls):
    instances = {}
    def wrapper(*args, **kwargs):
        if cls not in instances:
            instances[cls] = cls(*args, **kwargs)
        return instances[cls]
    logging.info('singleton size %d' % (len(instances)))
    return wrapper

总结,这个主要是python依靠jpype,jpype运行JVM,JVM调用相关的包处理QR,主要实现的包为google的zxing。

[happyprince, http://blog.csdn.net/ld326/article/details/78671099]

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯