2012-05-14 14 views
8

Ho un file jpeg con codice a barre 2D. La risoluzione dell'immagine è 1593X1212. Sto usando la libreria xing per decodificare questo codice a barre dall'immagine. Ho ottenuto il seguente codice sulla rete.L'eccezione com.google.zxing.NotFoundException arriva quando viene eseguito il programma Java core?

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

}

Quando eseguito questo semplice programma di base Java ho dato eccezione

com.google.zxing.NotFoundException 

sua nemmeno dà alcun stackstrace.

Voglio chiedere agli esperti che il motivo di questo tipo di eccezione è in arrivo. Grazie!

+2

Hai soluzione di questo problema? Sto affrontando lo stesso problem..please fatemi sapere –

risposta

3

Tale eccezione viene generata quando nessun codice a barre viene trovato nell'immagine:

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

+1

Thank You Rispondere Sir! Ma l'immagine fornita sopra contiene un codice a barre 2D, la risoluzione del codice a barre è di circa 84 pixel x 82 pixel. Allora perché il codice sopra non sta trovando il codice a barre sull'immagine. –

+0

Hai provato a utilizzare lo stesso codice ma con un'immagine di codice a barre diversa? Esistono immagini campione di codici a barre per testare il tuo codice? –

+0

Sì, ho cambiato l'immagine e il programma è stato rieseguito, nonostante abbia dato la stessa eccezione –

2

è normale; significa semplicemente che non è stato trovato alcun codice a barre. Non hai fornito l'immagine, quindi non posso dire se l'immagine è leggibile, per non parlare di un formato di codice a barre supportato.

+0

Come si può "modificare" con le impostazioni di precisione/ricerca? C'è documentazione su questo? Quando ho un grande PNG (da un PDF) che ha un qr-code nell'angolo in alto a sinistra, e tutto il resto è uno spazio bianco vuoto, non lo trova ... – mmcrae

6

Ho avuto lo stesso problema. Ho usato un'immagine che conoscevo aveva un codice QR valido e ho anche ricevuto com.google.zxing.NotFoundException.

Il problema è che l'immagine che si utilizza come sorgente è troppo grande per la decodifica della libreria. Dopo aver ridotto le dimensioni della mia immagine, il decodificatore del codice QR funzionava.

Ai fini della mia domanda, il codice QR sull'immagine è sempre più o meno nella stessa area, quindi ho utilizzato la funzione getSubimage della classe BufferedImage per isolare il codice 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

Ho avuto lo stesso problema, mi stava chiamando un readQRCode (filePath, charset, hintMap); e stava ricevendo lo stesso messaggio. Stavo chiamando una libreria che avevo scritto usando le librerie di zxing. Per risolverlo basta aggiungere i jar (zxing) al codice di primo livello, anche se non si accede alle librerie.

+0

suggerendo di ricontrollare i JAR sul loro classpath è non è probabile che aiuti qualcuno a cercare questo specifico errore. Non è veramente rilevante per questo argomento – mmcrae

3

Ho avuto lo stesso problema. Quando stavo eseguendo quasi esattamente lo stesso codice sulle librerie Java SE funzionava. Quando eseguo il codice Android utilizzando la stessa immagine, non ha funzionato. Passa un sacco di ore cercando di scoprire ...

  1. problema: devi ridimensionare l'immagine per essere più piccola. Non è possibile utilizzare direttamente un'immagine per smartphone. È grande. Nel mio test ha funzionato con un'immagine di circa 200 KB.

è possibile ridimensionare una bitmap utilizzando

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

  1. problema: è necessario attivare alcune bandiere. Giocando con quasi tutte le bandiere questa soluzione ha funzionato per me:

    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. problema: La biblioteca Android del ZXing eseguire la scansione del codice a barre, una volta, supponendo che il codice a barre sul quadro ha già il giusto orientamento. Se questo non è il caso, devi eseguirlo quattro volte, ruotando ogni volta l'immagine di circa 90 gradi!

Per la rotazione è possibile utilizzare questo metodo. Angolo è l'angolo in gradi.

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

Già questo codice se si utilizza,

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

Per apportare modifiche di questo codice. la sua conformly di lavoro,

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