15

2Dバーコードを含むjpegファイルがあります。画像の解像度は1593X1212です。xingライブラリを使用してこのバーコードを画像からデコードしています。ネットで次のコードを入手しました。

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

}

この単純なコアJavaプログラムを実行したとき、例外が発生しました

com.google.zxing.NotFoundException

それもstackstraceを与えません。

なぜそのような例外が発生するのか、専門家に聞いてみたいと思います。ありがとうございます!

4

9 に答える 9

12

私も同じ問題を抱えていました。有効な 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";
     }
于 2013-02-18T12:04:07.757 に答える
11

私も同じ問題を抱えていました。Java SE ライブラリでほぼ同じコードを実行していたとき、それは機能しました。同じ画像を使用して Android コードを実行すると、機能しませんでした。調べるのに何時間も費やして...

  1. 問題: 画像のサイズを小さくする必要があります。スマートフォンの写真を直接使用することはできません。それは大きいです。私のテストでは、約 200KB の画像で動作しました。

を使用してビットマップをスケーリングできます

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

  1. 問題: いくつかのフラグをオンにする必要があります。このソリューションが私のために働いたほぼすべてのフラグをいじってみました:

    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. 問題: ZXing の Android ライブラリは、バーコード スキャンを 1 回実行します。これは、画像のバーコードが既に正しい向きになっていることを前提としています。そうでない場合は、4 回実行する必要があります。毎回画像を 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);
    }
于 2015-05-08T17:17:54.100 に答える
3

画像にバーコードが見つからない場合、その例外がスローされます。

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

于 2012-05-14T12:55:03.313 に答える
2

それは正常です。バーコードが見つからなかっただけです。画像を提供していないため、画像が読み取れるかどうか、サポートされているバーコード形式があるかどうかはわかりません。

于 2012-05-14T13:59:58.493 に答える
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();
}
于 2016-09-02T05:32:06.637 に答える
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();
            }
于 2013-12-27T10:24:09.617 に答える