2016-03-24 88 views
3

首先,我阅读了所有这些主题,了解如何在Java中使用Zxing,但总是在com.google.zxing.client.j2se丢失时出错。 zxing core-3.2.1.jar在eclipse和所有其他zxing软件包工作除非j2se)或刚刚找到创建qr图像的解决方案...查找图像中的QR码并使用Zxing对其进行解码

我的目标是编写一个单一的方法,获取图像文件找到qr在此图像中码,解码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"; 
    } 

} 

综上所述方法应该得到的图像文件,如后续荷兰国际集团

enter image description here

,而应返回的URL,或者如果只是失败 “”。

该代码应该与Zxing 3.2.1兼容。

编辑:问题已解决。对于对此感兴趣的其他人,我想说,将外部罐子core-3.2.1.jarjavase-3.2.1.jar添加到外部罐子是很重要的。我的答案没有后者,但取决于Android图像库。

+0

什么你的问题? –

+0

问题是我怎样才能使用Zxing 3.2.1的算法;另一个方向显示在这里:http://crunchify.com/java-simple-qr-code-generator-example/ – Tim

回答

2

这里是

  1. 你需要构建斑马线库中的代码从QR代码创建QR码和阅读邮件

  2. 主要描述上的QR码的创建和QR码提取

    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); 
        return qrCodeResult.getText(); 
        } 
    } 
    
+0

谢谢。你的代码是使用eclipse进行开发的好基础,因为你不使用android库。如果'javase-3.2.1.jar'被添加到外部罐子中,则这可以使用Zxing 3.2.1。 – Tim

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(); 
} 
} 
+0

感谢您的回答,但至少'BufferedImageLuminanceSource'不适用于'Zxing 3.2.1'' – Tim

+0

我使用[此jar](http://mvnrepository.com/artifact/com.google.zxing/core/2.2)阅读qrcode和[that](http://www.java2s.com/Code/Jar/) w/Downloadwebcamcapture033jar.htm)用网络摄像头进行图像捕捉。它必须包括所有的类 –

+0

这是2.2.0版本,不是3.2.1然而,我很感谢你的答案,因为你想帮助。其实在完整的Stackoverflow中是没有用的3.2.1版本。 *创建* qr代码的唯一工作代码是从crunshify,但我想要相反的方向... – Tim

2

我现在读深入斑马线和下面的代码将与斑马线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; 
}