【问题标题】:Find QR code in image and decode it using Zxing在图像中查找二维码并使用 Zxing 对其进行解码
【发布时间】:2016-03-24 21:45:40
【问题描述】:

首先,我通读了如何在 Java 中使用 Zxing 的所有主题,但总是因为缺少 com.google.zxing.client.j2se.* 出现错误(我在 eclipse 中加载了 zxing core-3.2.1.jar并且所有其他 zxing 包都可以工作,除非 j2se) 或刚刚找到用于创建 qr 图像的解决方案...

我的目标是编写一个获取图像文件的方法,在该图像中找到二维码,解码二维码并返回字符串,基本上应该如下所示:

import com.google.zxing.*;

public class QRCode {

    /*
     * ...
     */

    public String getDecodedString(SomeStandardImageType photo){
        // detect the qr code in a photo
        // create qr image from detected area in photo
        // decode the new created qr image and return the string
        return "This is the decoded dataString from the qr code in the photo";
    }

}

总结一下方法应该得到如下图片文件

并且应该返回 url 或者如果失败只是 ""。

代码应该兼容Zxing 3.2.1。

编辑:问题解决了。对于对此感兴趣的其他人,我想说将外部 jars core-3.2.1.jar javase-3.2.1.jar 添加到外部 jars 中很重要。我的答案在没有后者的情况下有效,但取决于 android 图像库。

【问题讨论】:

标签: java qr-code zxing


【解决方案1】:

这是创建二维码并从二维码读取消息的代码

  1. 你需要构建 zxing 库

  2. 主要描述二维码创建和二维码提取

    package com.attendance.mark;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.util.HashMap;
    import java.util.Map;
    
    import javax.imageio.ImageIO;
    
    import com.google.zxing.BarcodeFormat;
    import com.google.zxing.BinaryBitmap;
    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;
    import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
    
    public class QRCode {
    
        /**
         * 
         * @param args 
         * @throws WriterException
         * @throws IOException
         * @throws NotFoundException
         */
      public static void main(String[] args) throws WriterException, IOException,
          NotFoundException {
        String qrCodeData = "student3232_2015_12_15_10_29_46_123";
        String filePath = "F:\\Opulent_ProjectsDirectory_2015-2016\\.metadata\\.plugins\\org.eclipse.wst.server.core\\tmp0\\wtpwebapps\\AttendanceUsingQRCode\\QRCodes\\student3232_2015_12_15_10_29_46_123";
        String charset = "UTF-8"; // or "ISO-8859-1"
        Map<EncodeHintType, ErrorCorrectionLevel> hintMap = new HashMap<EncodeHintType, ErrorCorrectionLevel>();
        hintMap.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L);
    
        createQRCode(qrCodeData, filePath, charset, hintMap, 200, 200);
        System.out.println("QR Code image created successfully!");
    
        System.out.println("Data read from QR Code: "
            + readQRCode(filePath, charset, hintMap));
    
      }
    
      /***
       * 
       * @param qrCodeData
       * @param filePath
       * @param charset
       * @param hintMap
       * @param qrCodeheight
       * @param qrCodewidth
       * @throws WriterException
       * @throws IOException
       */
      public static void createQRCode(String qrCodeData, String filePath,
          String charset, Map hintMap, int qrCodeheight, int qrCodewidth)
          throws WriterException, IOException {
        BitMatrix matrix = new MultiFormatWriter().encode(
            new String(qrCodeData.getBytes(charset), charset),
            BarcodeFormat.QR_CODE, qrCodewidth, qrCodeheight);
        MatrixToImageWriter.writeToFile(matrix, filePath.substring(filePath
            .lastIndexOf('.') + 1), new File(filePath));
      }
    
      /**
       * 
       * @param filePath
       * @param charset
       * @param hintMap
       * 
       * @return Qr Code value 
       * 
       * @throws FileNotFoundException
       * @throws IOException
       * @throws NotFoundException
       */
      public static String readQRCode(String filePath, String charset, Map hintMap)
          throws FileNotFoundException, IOException, NotFoundException {
        BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(
            new BufferedImageLuminanceSource(
                ImageIO.read(new FileInputStream(filePath)))));
        Result qrCodeResult = new MultiFormatReader().decode(binaryBitmap, hintMap);
        return qrCodeResult.getText();
      }
    }
    

【讨论】:

  • 谢谢。由于您没有使用 android 库,因此您的代码是使用 eclipse 开发的良好基础。如果将 javase-3.2.1.jar 也添加到外部 jar 中,则使用 Zxing 3.2.1 即可。
【解决方案2】:

我现在更深入地阅读了 Zxing,下面的代码将适用于 Zxing v3.2.1(此代码在没有 javase lib 的情况下工作)

// Imports
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;

import com.google.zxing.BinaryBitmap;
import com.google.zxing.ChecksumException;
import com.google.zxing.FormatException;
import com.google.zxing.LuminanceSource;
import com.google.zxing.NotFoundException;
import com.google.zxing.RGBLuminanceSource;
import com.google.zxing.Reader;
import com.google.zxing.Result;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.qrcode.QRCodeReader;

// Interesting method
public static String decodeQRImage(String path) {
    Bitmap bMap = BitmapFactory.decodeFile(path);
    String decoded = null;

    int[] intArray = new int[bMap.getWidth() * bMap.getHeight()];
    bMap.getPixels(intArray, 0, bMap.getWidth(), 0, 0, bMap.getWidth(),
            bMap.getHeight());
    LuminanceSource source = new RGBLuminanceSource(bMap.getWidth(),
            bMap.getHeight(), intArray);
    BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));

    Reader reader = new QRCodeReader();
    try {
        Result result = reader.decode(bitmap);
        decoded = result.getText();
    } catch (NotFoundException e) {
        e.printStackTrace();
    } catch (ChecksumException e) {
        e.printStackTrace();
    } catch (FormatException e) {
        e.printStackTrace();
    }
    return decoded;
}

【讨论】:

    【解决方案3】:

    这段代码对我来说很好用。希望它有助于导入必要的包,它应该可以工作

    public class QR_Reader extends JFrame implements Runnable, ThreadFactory {
    
    private static final long serialVersionUID = 6441489157408381878L;
    
    private Executor executor = Executors.newSingleThreadExecutor(this);
    
    private Webcam webcam = null;
    private WebcamPanel panel = null;
    String s;
    
    public QR_Reader() {
        super();
        setLayout(new FlowLayout());
        setTitle("Reading QR Code");
        Dimension size = WebcamResolution.QVGA.getSize();
        webcam = Webcam.getWebcams().get(0);
        webcam.setViewSize(size);
        panel = new WebcamPanel(webcam);
        panel.setPreferredSize(size);
        add(panel);
        pack();
        setVisible(true);
        setResizable(false);
        executor.execute(this);
    }
    @Override
    public void run() {
    
        do {
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
    
            Result result = null;
            BufferedImage image = null;
    
            if (webcam.isOpen()) {
    
                if ((image = webcam.getImage()) == null) {
                    continue;
                }
    
                LuminanceSource source = new BufferedImageLuminanceSource(image);
                BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
    
                try {
                    result = new MultiFormatReader().decode(bitmap);
                } catch (NotFoundException e) {
                    // fall thru, it means there is no QR code in image
                }
            }
    
            if (result != null) {
                String time_then=result.getText();  //this is the text extracted from QR CODE
                webcam.close();
                this.setVisible(false);
                this.dispose();
                try {
                    new Compare().C_Main(time_then);
                } catch (ParseException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
    
        } while (true);
    }
    
    @Override
    public Thread newThread(Runnable r) {
        Thread t = new Thread(r, "example-runner");
        t.setDaemon(true);
        return t;
    }
    
    void QRC_Main() {
        new QR_Reader();
    }
    }
    

    【讨论】:

    • 感谢您的回答,但至少BufferedImageLuminanceSourceZxing 3.2.1 中对我不可用
    • 我使用this jar 读取二维码,使用[那个] (java2s.com/Code/Jar/w/Downloadwebcamcapture033jar.htm) 使用网络摄像头拍摄图像。它必须包括所有类
    • 这是 2.2.0 版而不是 3.2.1 版,但我感谢您的回答,因为您想提供帮助。事实上,完整的 Stackoverflow 没有工作 3.2.1 版本。 creating 二维码的唯一工作代码来自 crunshify 但我想要相反的方向......
    • 如果没有解决方案,我会选择 2.2.0,但我仍然希望有人具备为 3.2.1 编写解决方案的技能
    猜你喜欢
    • 1970-01-01
    • 2011-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多