Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

com.google.zxing.NotFoundException exception comes when core java program executed?

I have a jpeg file which has 2D bar code. Image resolution is 1593X1212. I am using xing library to decode this barcode from image. I got following code on net.

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

}

When I executed this simple core java program I given exception

com.google.zxing.NotFoundException

Its not even gives any stackstrace.

I want to ask the experts that why such kind of exception is comming. Thanks You!

like image 994
Param-Ganak Avatar asked May 14 '12 12:05

Param-Ganak


5 Answers

I had the same problem. I used an image that I knew had a valid QR code and I also got the com.google.zxing.NotFoundException.

The problem is that the image you use as a source is to large for the library to decode. After I reduced the size of my image the QR code decoder worked.

For the purpose of my application, the QR code on the image would always be more or less in the same area, so I used the getSubimage function of the BufferedImage class to isolate the QR code.

     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";
     }
like image 56
Stephan Bouwer Avatar answered Nov 07 '22 23:11

Stephan Bouwer


I had the same problem. When I was running nearly exactly the same code on the Java SE libs it worked. When I run the Android code using the same picture it didn't work. Spend a lot of hours trying to find out...

  1. problem: you have to resize the Picture to be more little. You can't use directly a Smartphone picture. It is to big. In my test it worked with a picture being about 200KB.

You can Scale a bitmap using

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

  1. problem: You have to turn on some flags. Playing around with nearly all the flags this solution worked for 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. problem: The Android library of ZXing run the barcode scan once, supposing the barcode on the picture already has the right orientation. If this is not the case you have to run it four times, each time rotation the picture around 90 degree!

For rotation you can use this method. Angle is the angle in degrees.

    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);
    }
like image 20
techgeek89 Avatar answered Nov 07 '22 22:11

techgeek89


That exception is thrown when no barcode is found in the image:

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

like image 41
Colin D Avatar answered Nov 07 '22 23:11

Colin D


I have adjusted target resolution in ImageAnalysis and it started to work.

From

ImageAnalysis imageAnalysis =
        new ImageAnalysis.Builder()
                .setTargetResolution(new Size(mySurfaceView.getWidth(), mySurfaceView.getHeight()))
                .setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)
                .build();

to this one

    ImageAnalysis imageAnalysis =
            new ImageAnalysis.Builder()
                    .setTargetResolution(new Size(700, 500))
                    .setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)
                    .build();
like image 3
trixo Avatar answered Nov 07 '22 22:11

trixo


It is normal; it just means no barcode was found. You haven't provided the image, so I can't say whether your image is even readable, let alone has a supported barcode format.

like image 2
Sean Owen Avatar answered Nov 07 '22 21:11

Sean Owen