2012-05-14 39 views
8

Tôi có tệp jpeg có mã vạch 2D. Độ phân giải hình ảnh là 1593X1212. Tôi đang sử dụng thư viện xing để giải mã mã vạch này từ hình ảnh. Tôi đã nhận được mã sau trên mạng.ngoại lệ com.google.zxing.NotFoundException xảy ra khi chương trình java lõi được thực thi?

import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.IOException; 
import java.io.InputStream; 
import javax.imageio.ImageIO; 
import com.google.zxing.BinaryBitmap; 
import com.google.zxing.ChecksumException; 
import com.google.zxing.FormatException; 
import com.google.zxing.LuminanceSource; 
import com.google.zxing.MultiFormatReader; 
import com.google.zxing.NotFoundException; 
    import com.google.zxing.Reader; 
import com.google.zxing.Result; 
import com.google.zxing.client.j2se.BufferedImageLuminanceSource; 
import com.google.zxing.common.HybridBinarizer; 


public class NewLibTest { 
    public static void main(String args[]){ 
    System.out.println(decode(new File("E:\\xyz.jpg"))); 
    } 

    /** 
     * Decode method used to read image or barcode itself, and recognize the barcode, 
     * get the encoded contents and returns it. 
    * @param <DecodeHintType> 
     * @param file image that need to be read. 
     * @param config configuration used when reading the barcode. 
     * @return decoded results from barcode. 
     */ 
    public static String decode(File file){//, Map<DecodeHintType, Object> hints) throws Exception { 
     // check the required parameters 
     if (file == null || file.getName().trim().isEmpty()) 
      throw new IllegalArgumentException("File not found, or invalid file name."); 
     BufferedImage image = null; 
     try { 
      image = ImageIO.read(file); 
     } catch (IOException ioe) { 
      try { 
       throw new Exception(ioe.getMessage()); 
      } catch (Exception e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
     if (image == null) 
      throw new IllegalArgumentException("Could not decode image."); 
     LuminanceSource source = new BufferedImageLuminanceSource(image); 
     BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source)); 
     MultiFormatReader barcodeReader = new MultiFormatReader(); 
     Result result; 
     String finalResult = null; 
     try { 
      //if (hints != null && ! hints.isEmpty()) 
       // result = barcodeReader.decode(bitmap, hints); 
      //else 
       result = barcodeReader.decode(bitmap); 
      // setting results. 
      finalResult = String.valueOf(result.getText()); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      // throw new BarcodeEngine().new BarcodeEngineException(e.getMessage()); 
     } 
     return finalResult; 
    } 

}

Khi tôi thực hiện chương trình cốt lõi java đơn giản này tôi cho ngoại lệ

com.google.zxing.NotFoundException 

của nó thậm chí không cung cấp cho bất kỳ stackstrace.

Tôi muốn hỏi các chuyên gia rằng tại sao loại ngoại lệ như vậy lại xuất hiện. Cảm ơn bạn!

+2

Bạn có giải pháp về vấn đề này không? Tôi đang đối mặt với cùng một vấn đề ... vui lòng cho tôi biết –

Trả lời

3

ngoại lệ đó được ném khi không có mã vạch được tìm thấy trong hình ảnh:

http://zxing.org/w/docs/javadoc/com/google/zxing/NotFoundException.html

+1

Cảm ơn bạn Trả lời Sir! Nhưng hình ảnh được cung cấp ở trên chứa Mã vạch 2D độ phân giải của mã vạch xấp xỉ 84Pix X 82pix. Sau đó, tại sao mã trên không tìm thấy mã vạch trên hình ảnh. –

+0

Bạn đã thử sử dụng cùng một mã nhưng với một hình ảnh mã vạch khác? Có bất kỳ hình ảnh mẫu mã vạch nào để kiểm tra mã của bạn không? –

+0

Có Tôi đã thay đổi hình ảnh một lần nữa đã thực hiện lại chương trình mà nó vẫn đang đưa ra cùng một ngoại lệ –

2

Nó là bình thường; nó chỉ có nghĩa là không tìm thấy mã vạch. Bạn chưa cung cấp hình ảnh, vì vậy tôi không thể nói liệu hình ảnh của bạn có đọc được hay không, hãy để một mình có định dạng mã vạch được hỗ trợ.

+0

Làm thế nào bạn có thể "tinh chỉnh" với các thiết lập chính xác/tìm kiếm? Có tài liệu về điều đó không? Khi tôi có một PNG lớn (từ PDF) có mã qr ở góc trên cùng bên trái, và tất cả những thứ khác là khoảng trắng trống, nó không thể tìm thấy nó ... – mmcrae

6

Tôi gặp vấn đề tương tự. Tôi đã sử dụng hình ảnh mà tôi biết có mã QR hợp lệ và tôi cũng có com.google.zxing.NotFoundException.

Vấn đề là hình ảnh bạn sử dụng làm nguồn là lớn để thư viện giải mã. Sau khi tôi giảm kích thước hình ảnh của mình, bộ giải mã mã QR đã hoạt động.

Vì mục đích của ứng dụng, mã QR trên hình ảnh sẽ luôn ít nhiều trong cùng một khu vực, vì vậy tôi đã sử dụng hàm getSubimage của lớp BufferedImage để tách mã QR.

 BufferedImage image; 
    image = ImageIO.read(imageFile); 
    BufferedImage cropedImage = image.getSubimage(0, 0, 914, 400); 
    // using the cropedImage instead of image 
    LuminanceSource source = new BufferedImageLuminanceSource(cropedImage); 
    BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source)); 
    // barcode decoding 
    QRCodeReader reader = new QRCodeReader(); 
    Result result = null; 
    try 
    { 
     result = reader.decode(bitmap); 
    } 
    catch (ReaderException e) 
    { 
     return "reader error"; 
    } 
0
try { 
       String a = textField_1.getText(); //my image path 
       InputStream barCodeInputStream = new FileInputStream(""+a); 
       BufferedImage barCodeBufferedImage = ImageIO.read(barCodeInputStream); 

       LuminanceSource source = new BufferedImageLuminanceSource(barCodeBufferedImage); 
       BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source)); 
       MultiFormatReader reader = new MultiFormatReader(); 
       com.google.zxing.Result result = reader.decode(bitmap); 

       System.out.println("Barcode text is " + result.getText()); 
       textField.setText(""+result.getText()); 
      } catch (Exception e) { 
       // TODO: handle exception 
       JOptionPane.showMessageDialog(null, "This image does not contain barcode", "Warning", JOptionPane.WARNING_MESSAGE); 
       e.printStackTrace(); 
      } 
0

tôi đã cùng một vấn đề, tôi đã gọi một readQRCode (filepath, charset, hintMap); và nhận được cùng một thông điệp. Tôi đã gọi một thư viện mà tôi đã viết bằng thư viện zxing. Để khắc phục, chỉ cần thêm các lọ (zxing) vào mã cấp cao nhất của bạn, ngay cả khi các thư viện không được truy cập ở đó.

+0

gợi ý kiểm tra lại JAR trên đường dẫn lớp của họ không có khả năng giúp ai đó tìm kiếm lỗi cụ thể này. Nó không thực sự liên quan đến chủ đề này – mmcrae

3

Tôi đã gặp vấn đề tương tự. Khi tôi chạy gần như chính xác cùng một mã trên thư viện Java SE nó hoạt động. Khi tôi chạy mã Android bằng cách sử dụng cùng một hình ảnh nó không hoạt động. Hãy dành rất nhiều thời gian để tìm hiểu ...

  1. vấn đề: bạn phải đổi kích thước Ảnh thành ít hơn. Bạn không thể sử dụng trực tiếp ảnh điện thoại thông minh. Nó to lớn. Trong thử nghiệm của tôi nó đã làm việc với một bức tranh khoảng 200KB.

Bạn có thể mở rộng một bitmap sử dụng

Bitmap resize = Bitmap.createScaledBitmap(srcBitmap, dstWidth,dstHeight,false);

  1. vấn đề: Bạn cần phải bật một số cờ. Chơi xung quanh với gần như tất cả các cờ giải pháp này làm việc cho tôi:

    Map<DecodeHintType, Object> tmpHintsMap = new EnumMap<DecodeHintType, Object>(
         DecodeHintType.class); 
    tmpHintsMap.put(DecodeHintType.TRY_HARDER, Boolean.TRUE); 
    tmpHintsMap.put(DecodeHintType.POSSIBLE_FORMATS, 
         EnumSet.allOf(BarcodeFormat.class)); 
    tmpHintsMap.put(DecodeHintType.PURE_BARCODE, Boolean.FALSE); 
    

    ...

    MultiFormatReader mfr = null; 
    mfr = new MultiFormatReader(); 
    result = mfr.decode(binaryBitmap, tmpHintsMap); 
    
  2. vấn đề: Thư viện Android của ZXing chạy mã vạch quét một lần, giả mã vạch trên hình ảnh đã có định hướng đúng đắn. Nếu đây không phải là trường hợp bạn phải chạy nó bốn lần, mỗi lần xoay hình ảnh khoảng 90 độ!

Để quay, bạn có thể sử dụng phương pháp này. Góc là góc theo độ.

public Bitmap rotateBitmap(Bitmap source, float angle) 
    { 
      Matrix matrix = new Matrix(); 
      matrix.postRotate(angle); 
      return Bitmap.createBitmap(source, 0, 0, source.getWidth(), source.getHeight(), matrix, true); 
    } 
0

Đã mã này nếu bạn sử dụng,

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, tmpHintsMap); 

    return qrCodeResult.getText(); 
} 

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, tmpHintsMap); 

    return qrCodeResult.getText(); 
} 

Để thực hiện thay đổi mã này. phù hợp với công việc của mình,

public static String readQRCode(String filePath, String charset, Map hintMap) 
throws FileNotFoundException, IOException, NotFoundException { 
    Map < DecodeHintType, Object > tmpHintsMap = new EnumMap < DecodeHintType, Object > (
     DecodeHintType.class); 

    //tmpHintsMap.put(DecodeHintType.TRY_HARDER, Boolean.FALSE); 
    //tmpHintsMap.put(DecodeHintType.POSSIBLE_FORMATS, EnumSet.allOf(BarcodeFormat.class)); 
    tmpHintsMap.put(DecodeHintType.PURE_BARCODE, Boolean.TRUE); 

    BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(
     new BufferedImageLuminanceSource(
      ImageIO.read(new FileInputStream(filePath))))); 

    Result qrCodeResult = new MultiFormatReader().decode(binaryBitmap, tmpHintsMap); 

    return qrCodeResult.getText(); 
} 
Các vấn đề liên quan