2012-05-14 126 views
8

我有一個帶有二維條形碼的jpeg文件。圖像分辨率是1593X1212。我正在使用xing庫從圖像解碼這個條形碼。我在網上得到了以下代碼。當執行核心Java程序時,com.google.zxing.NotFoundException異常會出現嗎?

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

}

當我執行我定異常

com.google.zxing.NotFoundException 

它甚至沒有提供任何stackstrace這個簡單的核心Java程序。

我想問問專家,爲什麼會出現這種例外。 謝謝你!

+2

你有這個問題的解決方案?我面臨同樣的問題。請讓我知道 –

回答

3

時沒有條形碼的圖像中發現異常被拋出:

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

+1

謝謝你回答先生!但上面提供的圖像包含二維條形碼,條形碼的分辨率大約是84Pix X 82pix。那麼爲什麼上面的代碼沒有找到圖像上的條形碼。 –

+0

您是否嘗試過使用相同的代碼,但使用不同的條碼圖像?是否有任何條形碼示例圖片來測試您的代碼? –

+0

是的,我已經改變了圖像重新執行的程序仍然是它給出了相同的例外 –

2

這是正常的;這意味着沒有發現條形碼。你還沒有提供圖像,所以我不能說你的圖像是否可讀,更不用說支持條形碼格式了。

+0

你怎麼能「精確」與準確性/搜索設置?那裏有文檔嗎?當我有一個大的PNG(來自一個PDF),它的左上角有一個qr代碼,並且其他都是空白的空白時,它找不到它... – mmcrae

6

我有同樣的問題。我使用了一個我知道有一個有效的QR碼的圖像,並且我也收到了com.google.zxing.NotFoundException。

問題是,您用作源的圖像大到需要解碼的庫。在縮小了圖像的大小後,QR碼解碼器就可以工作。

對於我的應用程序來說,圖像上的QR碼總是或多或少都在同一區域,所以我使用了BufferedImage類的getSubimage函數來隔離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

我有同樣的問題,我要召開readQRCode(文件路徑,字符集,hintMap);並得到相同的信息。我打電話給我使用zxing庫編寫的庫。要解決這個問題,只需將(zxing)jar添加到頂級代碼中,即使這些庫不在那裏訪問。

+0

建議重新檢查其類路徑中的JAR是不可能幫助某人搜索這個特定的錯誤。這與這個話題不相關 – mmcrae

3

我有同樣的問題。當我在Java SE庫上運行幾乎完全相同的代碼時,它工作正常。當我使用相同的圖片運行Android代碼時,它不起作用。花費大量的時間試圖找出...

  1. 問題:你必須調整圖片更小。您不能直接使用智能手機圖片。它很大。在我的測試中,它使用了大約200KB的圖片。

可以縮放使用

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

  • 問題的位圖:你必須打開一些標誌。玩這個解決方案爲我工作的幾乎所有的旗幟:

    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); 
    
  • 問題:斑馬線的Android的庫運行條碼掃描一次,假設條形碼上的圖像已具有正確的方向。如果不是這種情況,你必須運行四次,每次將圖片旋轉90度!

  • 對於旋轉,您可以使用此方法。角度是以度爲單位的角度。

    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

    已如果您使用此代碼,

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

    爲了使該代碼的變化。它正常工作,

    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(); 
    } 
    
    相關問題