mirror of
https://github.com/zxing/zxing.git
synced 2024-11-09 20:44:03 -08:00
"Split" ReaderException into subclasses to enable more useful error reporting
git-svn-id: https://zxing.googlecode.com/svn/trunk@1195 59b500cc-1b3d-0410-9834-0bbf25fbcc57
This commit is contained in:
parent
f9b648c131
commit
5ef5f3b02d
|
@ -55,7 +55,7 @@ public abstract class Binarizer {
|
|||
* If used, the Binarizer will call BitArray.clear(). Always use the returned object.
|
||||
* @return The array of bits for this row (true means black).
|
||||
*/
|
||||
public abstract BitArray getBlackRow(int y, BitArray row) throws ReaderException;
|
||||
public abstract BitArray getBlackRow(int y, BitArray row) throws NotFoundException;
|
||||
|
||||
/**
|
||||
* Converts a 2D array of luminance data to 1 bit data. As above, assume this method is expensive
|
||||
|
@ -65,7 +65,7 @@ public abstract class Binarizer {
|
|||
*
|
||||
* @return The 2D array of bits for the image (true means black).
|
||||
*/
|
||||
public abstract BitMatrix getBlackMatrix() throws ReaderException;
|
||||
public abstract BitMatrix getBlackMatrix() throws NotFoundException;
|
||||
|
||||
/**
|
||||
* Creates a new object with the same type as this Binarizer implementation, but with pristine
|
||||
|
|
|
@ -62,7 +62,7 @@ public final class BinaryBitmap {
|
|||
* If used, the Binarizer will call BitArray.clear(). Always use the returned object.
|
||||
* @return The array of bits for this row (true means black).
|
||||
*/
|
||||
public BitArray getBlackRow(int y, BitArray row) throws ReaderException {
|
||||
public BitArray getBlackRow(int y, BitArray row) throws NotFoundException {
|
||||
return binarizer.getBlackRow(y, row);
|
||||
}
|
||||
|
||||
|
@ -74,7 +74,7 @@ public final class BinaryBitmap {
|
|||
*
|
||||
* @return The 2D array of bits for the image (true means black).
|
||||
*/
|
||||
public BitMatrix getBlackMatrix() throws ReaderException {
|
||||
public BitMatrix getBlackMatrix() throws NotFoundException {
|
||||
// The matrix is created on demand the first time it is requested, then cached. There are two
|
||||
// reasons for this:
|
||||
// 1. This work will never be done if the caller only installs 1D Reader objects, or if a
|
||||
|
|
37
core/src/com/google/zxing/ChecksumException.java
Normal file
37
core/src/com/google/zxing/ChecksumException.java
Normal file
|
@ -0,0 +1,37 @@
|
|||
/*
|
||||
* Copyright 2007 ZXing authors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.google.zxing;
|
||||
|
||||
/**
|
||||
* Thrown when a barcode was successfully detected and decoded, but
|
||||
* was not returned because its checksum feature failed.
|
||||
*
|
||||
* @author Sean Owen
|
||||
*/
|
||||
public final class ChecksumException extends ReaderException {
|
||||
|
||||
private static final ChecksumException instance = new ChecksumException();
|
||||
|
||||
private ChecksumException() {
|
||||
// do nothing
|
||||
}
|
||||
|
||||
public static ChecksumException getChecksumInstance() {
|
||||
return instance;
|
||||
}
|
||||
|
||||
}
|
38
core/src/com/google/zxing/FormatException.java
Normal file
38
core/src/com/google/zxing/FormatException.java
Normal file
|
@ -0,0 +1,38 @@
|
|||
/*
|
||||
* Copyright 2007 ZXing authors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.google.zxing;
|
||||
|
||||
/**
|
||||
* Thrown when a barcode was successfully detected, but some aspect of
|
||||
* the content did not conform to the barcode's format rules. This could have
|
||||
* been due to a mis-detection.
|
||||
*
|
||||
* @author Sean Owen
|
||||
*/
|
||||
public final class FormatException extends ReaderException {
|
||||
|
||||
private static final FormatException instance = new FormatException();
|
||||
|
||||
private FormatException() {
|
||||
// do nothing
|
||||
}
|
||||
|
||||
public static FormatException getFormatInstance() {
|
||||
return instance;
|
||||
}
|
||||
|
||||
}
|
|
@ -16,10 +16,10 @@
|
|||
|
||||
package com.google.zxing;
|
||||
|
||||
import com.google.zxing.datamatrix.DataMatrixReader;
|
||||
import com.google.zxing.oned.MultiFormatOneDReader;
|
||||
import com.google.zxing.pdf417.PDF417Reader;
|
||||
import com.google.zxing.qrcode.QRCodeReader;
|
||||
import com.google.zxing.datamatrix.DataMatrixReader;
|
||||
|
||||
import java.util.Hashtable;
|
||||
import java.util.Vector;
|
||||
|
@ -44,9 +44,9 @@ public final class MultiFormatReader implements Reader {
|
|||
*
|
||||
* @param image The pixel data to decode
|
||||
* @return The contents of the image
|
||||
* @throws ReaderException Any errors which occurred
|
||||
* @throws NotFoundException Any errors which occurred
|
||||
*/
|
||||
public Result decode(BinaryBitmap image) throws ReaderException {
|
||||
public Result decode(BinaryBitmap image) throws NotFoundException {
|
||||
setHints(null);
|
||||
return decodeInternal(image);
|
||||
}
|
||||
|
@ -57,9 +57,9 @@ public final class MultiFormatReader implements Reader {
|
|||
* @param image The pixel data to decode
|
||||
* @param hints The hints to use, clearing the previous state.
|
||||
* @return The contents of the image
|
||||
* @throws ReaderException Any errors which occurred
|
||||
* @throws NotFoundException Any errors which occurred
|
||||
*/
|
||||
public Result decode(BinaryBitmap image, Hashtable hints) throws ReaderException {
|
||||
public Result decode(BinaryBitmap image, Hashtable hints) throws NotFoundException {
|
||||
setHints(hints);
|
||||
return decodeInternal(image);
|
||||
}
|
||||
|
@ -70,9 +70,9 @@ public final class MultiFormatReader implements Reader {
|
|||
*
|
||||
* @param image The pixel data to decode
|
||||
* @return The contents of the image
|
||||
* @throws ReaderException Any errors which occurred
|
||||
* @throws NotFoundException Any errors which occurred
|
||||
*/
|
||||
public Result decodeWithState(BinaryBitmap image) throws ReaderException {
|
||||
public Result decodeWithState(BinaryBitmap image) throws NotFoundException {
|
||||
// Make sure to set up the default state so we don't crash
|
||||
if (readers == null) {
|
||||
setHints(null);
|
||||
|
@ -147,7 +147,7 @@ public final class MultiFormatReader implements Reader {
|
|||
}
|
||||
}
|
||||
|
||||
private Result decodeInternal(BinaryBitmap image) throws ReaderException {
|
||||
private Result decodeInternal(BinaryBitmap image) throws NotFoundException {
|
||||
int size = readers.size();
|
||||
for (int i = 0; i < size; i++) {
|
||||
Reader reader = (Reader) readers.elementAt(i);
|
||||
|
@ -158,7 +158,7 @@ public final class MultiFormatReader implements Reader {
|
|||
}
|
||||
}
|
||||
|
||||
throw ReaderException.getInstance();
|
||||
throw NotFoundException.getNotFoundInstance();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
37
core/src/com/google/zxing/NotFoundException.java
Normal file
37
core/src/com/google/zxing/NotFoundException.java
Normal file
|
@ -0,0 +1,37 @@
|
|||
/*
|
||||
* Copyright 2007 ZXing authors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.google.zxing;
|
||||
|
||||
/**
|
||||
* Thrown when a barcode was not found in the image. It might have been
|
||||
* partially detected but could not be confirmed.
|
||||
*
|
||||
* @author Sean Owen
|
||||
*/
|
||||
public final class NotFoundException extends ReaderException {
|
||||
|
||||
private static final NotFoundException instance = new NotFoundException();
|
||||
|
||||
private NotFoundException() {
|
||||
// do nothing
|
||||
}
|
||||
|
||||
public static NotFoundException getNotFoundInstance() {
|
||||
return instance;
|
||||
}
|
||||
|
||||
}
|
|
@ -37,9 +37,9 @@ public interface Reader {
|
|||
*
|
||||
* @param image image of barcode to decode
|
||||
* @return String which the barcode encodes
|
||||
* @throws ReaderException if the barcode cannot be located or decoded for any reason
|
||||
* @throws NotFoundException if the barcode cannot be located or decoded for any reason
|
||||
*/
|
||||
Result decode(BinaryBitmap image) throws ReaderException;
|
||||
Result decode(BinaryBitmap image) throws NotFoundException, ChecksumException, FormatException;
|
||||
|
||||
/**
|
||||
* Locates and decodes a barcode in some format within an image. This method also accepts
|
||||
|
@ -51,9 +51,9 @@ public interface Reader {
|
|||
* meaning of the data depends upon the hint type. The implementation may or may not do
|
||||
* anything with these hints.
|
||||
* @return String which the barcode encodes
|
||||
* @throws ReaderException if the barcode cannot be located or decoded for any reason
|
||||
* @throws NotFoundException if the barcode cannot be located or decoded for any reason
|
||||
*/
|
||||
Result decode(BinaryBitmap image, Hashtable hints) throws ReaderException;
|
||||
Result decode(BinaryBitmap image, Hashtable hints) throws NotFoundException, ChecksumException, FormatException;
|
||||
|
||||
/**
|
||||
* Resets any internal state the implementation has after a decode, to prepare it
|
||||
|
|
|
@ -23,7 +23,7 @@ package com.google.zxing;
|
|||
*
|
||||
* @author Sean Owen
|
||||
*/
|
||||
public final class ReaderException extends Exception {
|
||||
public abstract class ReaderException extends Exception {
|
||||
|
||||
// TODO: Currently we throw up to 400 ReaderExceptions while scanning a single 240x240 image before
|
||||
// rejecting it. This involves a lot of overhead and memory allocation, and affects both performance
|
||||
|
@ -34,7 +34,7 @@ public final class ReaderException extends Exception {
|
|||
// by disabling the generation of stack traces, which is especially time consuming. These are just
|
||||
// temporary measures, pending the big cleanup.
|
||||
|
||||
private static final ReaderException instance = new ReaderException();
|
||||
//private static final ReaderException instance = new ReaderException();
|
||||
|
||||
// EXCEPTION TRACKING SUPPORT
|
||||
// Identifies who is throwing exceptions and how often. To use:
|
||||
|
@ -45,11 +45,11 @@ public final class ReaderException extends Exception {
|
|||
// private static int exceptionCount = 0;
|
||||
// private static Map<String,Integer> throwers = new HashMap<String,Integer>(32);
|
||||
|
||||
private ReaderException() {
|
||||
ReaderException() {
|
||||
// do nothing
|
||||
}
|
||||
|
||||
public static ReaderException getInstance() {
|
||||
//public static ReaderException getInstance() {
|
||||
// Exception e = new Exception();
|
||||
// // Take the stack frame before this one.
|
||||
// StackTraceElement stack = e.getStackTrace()[1];
|
||||
|
@ -64,8 +64,8 @@ public final class ReaderException extends Exception {
|
|||
// }
|
||||
// exceptionCount++;
|
||||
|
||||
return instance;
|
||||
}
|
||||
//return instance;
|
||||
//}
|
||||
|
||||
// public static int getExceptionCountAndReset() {
|
||||
// int temp = exceptionCount;
|
||||
|
@ -91,7 +91,7 @@ public final class ReaderException extends Exception {
|
|||
// Prevent stack traces from being taken
|
||||
// srowen says: huh, my IDE is saying this is not an override. native methods can't be overridden?
|
||||
// This, at least, does not hurt. Because we use a singleton pattern here, it doesn't matter anyhow.
|
||||
public Throwable fillInStackTrace() {
|
||||
public final Throwable fillInStackTrace() {
|
||||
return null;
|
||||
}
|
||||
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
|
||||
package com.google.zxing.common;
|
||||
|
||||
import com.google.zxing.ReaderException;
|
||||
import com.google.zxing.NotFoundException;
|
||||
|
||||
/**
|
||||
* @author Sean Owen
|
||||
|
@ -32,7 +32,7 @@ public final class DefaultGridSampler extends GridSampler {
|
|||
float p1FromX, float p1FromY,
|
||||
float p2FromX, float p2FromY,
|
||||
float p3FromX, float p3FromY,
|
||||
float p4FromX, float p4FromY) throws ReaderException {
|
||||
float p4FromX, float p4FromY) throws NotFoundException {
|
||||
|
||||
PerspectiveTransform transform = PerspectiveTransform.quadrilateralToQuadrilateral(
|
||||
p1ToX, p1ToY, p2ToX, p2ToY, p3ToX, p3ToY, p4ToX, p4ToY,
|
||||
|
@ -43,7 +43,7 @@ public final class DefaultGridSampler extends GridSampler {
|
|||
|
||||
public BitMatrix sampleGrid(BitMatrix image,
|
||||
int dimension,
|
||||
PerspectiveTransform transform) throws ReaderException {
|
||||
PerspectiveTransform transform) throws NotFoundException {
|
||||
BitMatrix bits = new BitMatrix(dimension);
|
||||
float[] points = new float[dimension << 1];
|
||||
for (int y = 0; y < dimension; y++) {
|
||||
|
@ -72,7 +72,7 @@ public final class DefaultGridSampler extends GridSampler {
|
|||
// This results in an ugly runtime exception despite our clever checks above -- can't have
|
||||
// that. We could check each point's coordinates but that feels duplicative. We settle for
|
||||
// catching and wrapping ArrayIndexOutOfBoundsException.
|
||||
throw ReaderException.getInstance();
|
||||
throw NotFoundException.getNotFoundInstance();
|
||||
}
|
||||
}
|
||||
return bits;
|
||||
|
|
|
@ -18,7 +18,7 @@ package com.google.zxing.common;
|
|||
|
||||
import com.google.zxing.Binarizer;
|
||||
import com.google.zxing.LuminanceSource;
|
||||
import com.google.zxing.ReaderException;
|
||||
import com.google.zxing.NotFoundException;
|
||||
|
||||
/**
|
||||
* This Binarizer implementation uses the old ZXing global histogram approach. It is suitable
|
||||
|
@ -45,7 +45,7 @@ public class GlobalHistogramBinarizer extends Binarizer {
|
|||
}
|
||||
|
||||
// Applies simple sharpening to the row data to improve performance of the 1D Readers.
|
||||
public BitArray getBlackRow(int y, BitArray row) throws ReaderException {
|
||||
public BitArray getBlackRow(int y, BitArray row) throws NotFoundException {
|
||||
LuminanceSource source = getLuminanceSource();
|
||||
int width = source.getWidth();
|
||||
if (row == null || row.getSize() < width) {
|
||||
|
@ -79,7 +79,7 @@ public class GlobalHistogramBinarizer extends Binarizer {
|
|||
}
|
||||
|
||||
// Does not sharpen the data, as this call is intended to only be used by 2D Readers.
|
||||
public BitMatrix getBlackMatrix() throws ReaderException {
|
||||
public BitMatrix getBlackMatrix() throws NotFoundException {
|
||||
LuminanceSource source = getLuminanceSource();
|
||||
int width = source.getWidth();
|
||||
int height = source.getHeight();
|
||||
|
@ -134,7 +134,7 @@ public class GlobalHistogramBinarizer extends Binarizer {
|
|||
}
|
||||
}
|
||||
|
||||
private static int estimateBlackPoint(int[] buckets) throws ReaderException {
|
||||
private static int estimateBlackPoint(int[] buckets) throws NotFoundException {
|
||||
// Find the tallest peak in the histogram.
|
||||
int numBuckets = buckets.length;
|
||||
int maxBucketCount = 0;
|
||||
|
@ -175,7 +175,7 @@ public class GlobalHistogramBinarizer extends Binarizer {
|
|||
// TODO: It might be worth comparing the brightest and darkest pixels seen, rather than the
|
||||
// two peaks, to determine the contrast.
|
||||
if (secondPeak - firstPeak <= numBuckets >> 4) {
|
||||
throw ReaderException.getInstance();
|
||||
throw NotFoundException.getNotFoundInstance();
|
||||
}
|
||||
|
||||
// Find a valley between them that is low and closer to the white peak.
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
|
||||
package com.google.zxing.common;
|
||||
|
||||
import com.google.zxing.ReaderException;
|
||||
import com.google.zxing.NotFoundException;
|
||||
|
||||
/**
|
||||
* Implementations of this class can, given locations of finder patterns for a QR code in an
|
||||
|
@ -78,7 +78,7 @@ public abstract class GridSampler {
|
|||
* @param dimension width/height of {@link BitMatrix} to sample from image
|
||||
* @return {@link BitMatrix} representing a grid of points sampled from the image within a region
|
||||
* defined by the "from" parameters
|
||||
* @throws ReaderException if image can't be sampled, for example, if the transformation defined
|
||||
* @throws NotFoundException if image can't be sampled, for example, if the transformation defined
|
||||
* by the given points is invalid or results in sampling outside the image boundaries
|
||||
*/
|
||||
public abstract BitMatrix sampleGrid(BitMatrix image,
|
||||
|
@ -90,11 +90,11 @@ public abstract class GridSampler {
|
|||
float p1FromX, float p1FromY,
|
||||
float p2FromX, float p2FromY,
|
||||
float p3FromX, float p3FromY,
|
||||
float p4FromX, float p4FromY) throws ReaderException;
|
||||
float p4FromX, float p4FromY) throws NotFoundException;
|
||||
|
||||
public BitMatrix sampleGrid(BitMatrix image,
|
||||
int dimension,
|
||||
PerspectiveTransform transform) throws ReaderException {
|
||||
PerspectiveTransform transform) throws NotFoundException {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
|
@ -112,10 +112,10 @@ public abstract class GridSampler {
|
|||
*
|
||||
* @param image image into which the points should map
|
||||
* @param points actual points in x1,y1,...,xn,yn form
|
||||
* @throws ReaderException if an endpoint is lies outside the image boundaries
|
||||
* @throws NotFoundException if an endpoint is lies outside the image boundaries
|
||||
*/
|
||||
protected static void checkAndNudgePoints(BitMatrix image, float[] points)
|
||||
throws ReaderException {
|
||||
throws NotFoundException {
|
||||
int width = image.getWidth();
|
||||
int height = image.getHeight();
|
||||
// Check and nudge points from start until we see some that are OK:
|
||||
|
@ -124,7 +124,7 @@ public abstract class GridSampler {
|
|||
int x = (int) points[offset];
|
||||
int y = (int) points[offset + 1];
|
||||
if (x < -1 || x > width || y < -1 || y > height) {
|
||||
throw ReaderException.getInstance();
|
||||
throw NotFoundException.getNotFoundInstance();
|
||||
}
|
||||
nudged = false;
|
||||
if (x == -1) {
|
||||
|
@ -148,7 +148,7 @@ public abstract class GridSampler {
|
|||
int x = (int) points[offset];
|
||||
int y = (int) points[offset + 1];
|
||||
if (x < -1 || x > width || y < -1 || y > height) {
|
||||
throw ReaderException.getInstance();
|
||||
throw NotFoundException.getNotFoundInstance();
|
||||
}
|
||||
nudged = false;
|
||||
if (x == -1) {
|
||||
|
|
|
@ -18,7 +18,7 @@ package com.google.zxing.common;
|
|||
|
||||
import com.google.zxing.Binarizer;
|
||||
import com.google.zxing.LuminanceSource;
|
||||
import com.google.zxing.ReaderException;
|
||||
import com.google.zxing.NotFoundException;
|
||||
|
||||
/**
|
||||
* This class implements a local thresholding algorithm, which while slower than the
|
||||
|
@ -49,7 +49,7 @@ public final class HybridBinarizer extends GlobalHistogramBinarizer {
|
|||
super(source);
|
||||
}
|
||||
|
||||
public BitMatrix getBlackMatrix() throws ReaderException {
|
||||
public BitMatrix getBlackMatrix() throws NotFoundException {
|
||||
binarizeEntireImage();
|
||||
return matrix;
|
||||
}
|
||||
|
@ -61,7 +61,7 @@ public final class HybridBinarizer extends GlobalHistogramBinarizer {
|
|||
// Calculates the final BitMatrix once for all requests. This could be called once from the
|
||||
// constructor instead, but there are some advantages to doing it lazily, such as making
|
||||
// profiling easier, and not doing heavy lifting when callers don't expect it.
|
||||
private void binarizeEntireImage() throws ReaderException {
|
||||
private void binarizeEntireImage() throws NotFoundException {
|
||||
if (matrix == null) {
|
||||
LuminanceSource source = getLuminanceSource();
|
||||
if (source.getWidth() >= MINIMUM_DIMENSION && source.getHeight() >= MINIMUM_DIMENSION) {
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
|
||||
package com.google.zxing.common.detector;
|
||||
|
||||
import com.google.zxing.ReaderException;
|
||||
import com.google.zxing.NotFoundException;
|
||||
import com.google.zxing.ResultPoint;
|
||||
import com.google.zxing.common.BitMatrix;
|
||||
|
||||
|
@ -45,9 +45,9 @@ public final class MonochromeRectangleDetector {
|
|||
* last points are opposed on the diagonal, as are the second and third. The first point will be
|
||||
* the topmost point and the last, the bottommost. The second point will be leftmost and the
|
||||
* third, the rightmost
|
||||
* @throws ReaderException if no Data Matrix Code can be found
|
||||
* @throws NotFoundException if no Data Matrix Code can be found
|
||||
*/
|
||||
public ResultPoint[] detect() throws ReaderException {
|
||||
public ResultPoint[] detect() throws NotFoundException {
|
||||
int height = image.getHeight();
|
||||
int width = image.getWidth();
|
||||
int halfHeight = height >> 1;
|
||||
|
@ -95,10 +95,10 @@ public final class MonochromeRectangleDetector {
|
|||
* @param maxWhiteRun maximum run of white pixels that can still be considered to be within
|
||||
* the barcode
|
||||
* @return a {@link com.google.zxing.ResultPoint} encapsulating the corner that was found
|
||||
* @throws com.google.zxing.ReaderException if such a point cannot be found
|
||||
* @throws NotFoundException if such a point cannot be found
|
||||
*/
|
||||
private ResultPoint findCornerFromCenter(int centerX, int deltaX, int left, int right,
|
||||
int centerY, int deltaY, int top, int bottom, int maxWhiteRun) throws ReaderException {
|
||||
int centerY, int deltaY, int top, int bottom, int maxWhiteRun) throws NotFoundException {
|
||||
int[] lastRange = null;
|
||||
for (int y = centerY, x = centerX;
|
||||
y < bottom && y >= top && x < right && x >= left;
|
||||
|
@ -113,7 +113,7 @@ public final class MonochromeRectangleDetector {
|
|||
}
|
||||
if (range == null) {
|
||||
if (lastRange == null) {
|
||||
throw ReaderException.getInstance();
|
||||
throw NotFoundException.getNotFoundInstance();
|
||||
}
|
||||
// lastRange was found
|
||||
if (deltaX == 0) {
|
||||
|
@ -141,7 +141,7 @@ public final class MonochromeRectangleDetector {
|
|||
}
|
||||
lastRange = range;
|
||||
}
|
||||
throw ReaderException.getInstance();
|
||||
throw NotFoundException.getNotFoundInstance();
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -17,13 +17,15 @@
|
|||
package com.google.zxing.datamatrix;
|
||||
|
||||
import com.google.zxing.BarcodeFormat;
|
||||
import com.google.zxing.DecodeHintType;
|
||||
import com.google.zxing.BinaryBitmap;
|
||||
import com.google.zxing.ChecksumException;
|
||||
import com.google.zxing.DecodeHintType;
|
||||
import com.google.zxing.FormatException;
|
||||
import com.google.zxing.NotFoundException;
|
||||
import com.google.zxing.Reader;
|
||||
import com.google.zxing.ReaderException;
|
||||
import com.google.zxing.Result;
|
||||
import com.google.zxing.ResultPoint;
|
||||
import com.google.zxing.ResultMetadataType;
|
||||
import com.google.zxing.ResultPoint;
|
||||
import com.google.zxing.common.BitMatrix;
|
||||
import com.google.zxing.common.DecoderResult;
|
||||
import com.google.zxing.common.DetectorResult;
|
||||
|
@ -47,14 +49,16 @@ public final class DataMatrixReader implements Reader {
|
|||
* Locates and decodes a Data Matrix code in an image.
|
||||
*
|
||||
* @return a String representing the content encoded by the Data Matrix code
|
||||
* @throws ReaderException if a Data Matrix code cannot be found, or cannot be decoded
|
||||
* @throws NotFoundException if a Data Matrix code cannot be found
|
||||
* @throws FormatException if a Data Matrix code cannot be decoded
|
||||
* @throws ChecksumException if error correction fails
|
||||
*/
|
||||
public Result decode(BinaryBitmap image) throws ReaderException {
|
||||
public Result decode(BinaryBitmap image) throws NotFoundException, ChecksumException, FormatException {
|
||||
return decode(image, null);
|
||||
}
|
||||
|
||||
public Result decode(BinaryBitmap image, Hashtable hints)
|
||||
throws ReaderException {
|
||||
throws NotFoundException, ChecksumException, FormatException {
|
||||
DecoderResult decoderResult;
|
||||
ResultPoint[] points;
|
||||
if (hints != null && hints.containsKey(DecodeHintType.PURE_BARCODE)) {
|
||||
|
@ -86,7 +90,7 @@ public final class DataMatrixReader implements Reader {
|
|||
* around it. This is a specialized method that works exceptionally fast in this special
|
||||
* case.
|
||||
*/
|
||||
private static BitMatrix extractPureBits(BitMatrix image) throws ReaderException {
|
||||
private static BitMatrix extractPureBits(BitMatrix image) throws NotFoundException {
|
||||
// Now need to determine module size in pixels
|
||||
|
||||
int height = image.getHeight();
|
||||
|
@ -99,7 +103,7 @@ public final class DataMatrixReader implements Reader {
|
|||
borderWidth++;
|
||||
}
|
||||
if (borderWidth == minDimension) {
|
||||
throw ReaderException.getInstance();
|
||||
throw NotFoundException.getNotFoundInstance();
|
||||
}
|
||||
|
||||
// And then keep tracking across the top-left black module to determine module size
|
||||
|
@ -108,7 +112,7 @@ public final class DataMatrixReader implements Reader {
|
|||
moduleEnd++;
|
||||
}
|
||||
if (moduleEnd == width) {
|
||||
throw ReaderException.getInstance();
|
||||
throw NotFoundException.getNotFoundInstance();
|
||||
}
|
||||
|
||||
int moduleSize = moduleEnd - borderWidth;
|
||||
|
@ -119,13 +123,13 @@ public final class DataMatrixReader implements Reader {
|
|||
columnEndOfSymbol--;
|
||||
}
|
||||
if (columnEndOfSymbol < 0) {
|
||||
throw ReaderException.getInstance();
|
||||
throw NotFoundException.getNotFoundInstance();
|
||||
}
|
||||
columnEndOfSymbol++;
|
||||
|
||||
// Make sure width of barcode is a multiple of module size
|
||||
if ((columnEndOfSymbol - borderWidth) % moduleSize != 0) {
|
||||
throw ReaderException.getInstance();
|
||||
throw NotFoundException.getNotFoundInstance();
|
||||
}
|
||||
int dimension = (columnEndOfSymbol - borderWidth) / moduleSize;
|
||||
|
||||
|
@ -136,7 +140,7 @@ public final class DataMatrixReader implements Reader {
|
|||
|
||||
int sampleDimension = borderWidth + (dimension - 1) * moduleSize;
|
||||
if (sampleDimension >= width || sampleDimension >= height) {
|
||||
throw ReaderException.getInstance();
|
||||
throw NotFoundException.getNotFoundInstance();
|
||||
}
|
||||
|
||||
// Now just read off the bits
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
|
||||
package com.google.zxing.datamatrix.decoder;
|
||||
|
||||
import com.google.zxing.ReaderException;
|
||||
import com.google.zxing.FormatException;
|
||||
import com.google.zxing.common.BitMatrix;
|
||||
|
||||
/**
|
||||
|
@ -30,12 +30,12 @@ final class BitMatrixParser {
|
|||
|
||||
/**
|
||||
* @param bitMatrix {@link BitMatrix} to parse
|
||||
* @throws ReaderException if dimension is < 10 or > 144 or not 0 mod 2
|
||||
* @throws FormatException if dimension is < 10 or > 144 or not 0 mod 2
|
||||
*/
|
||||
BitMatrixParser(BitMatrix bitMatrix) throws ReaderException {
|
||||
BitMatrixParser(BitMatrix bitMatrix) throws FormatException {
|
||||
int dimension = bitMatrix.getDimension();
|
||||
if (dimension < 10 || dimension > 144 || (dimension & 0x01) != 0) {
|
||||
throw ReaderException.getInstance();
|
||||
throw FormatException.getFormatInstance();
|
||||
}
|
||||
|
||||
version = readVersion(bitMatrix);
|
||||
|
@ -52,10 +52,10 @@ final class BitMatrixParser {
|
|||
*
|
||||
* @param bitMatrix Original {@link BitMatrix} including alignment patterns
|
||||
* @return {@link Version} encapsulating the Data Matrix Code's "version"
|
||||
* @throws ReaderException if the dimensions of the mapping matrix are not valid
|
||||
* @throws FormatException if the dimensions of the mapping matrix are not valid
|
||||
* Data Matrix dimensions.
|
||||
*/
|
||||
Version readVersion(BitMatrix bitMatrix) throws ReaderException {
|
||||
Version readVersion(BitMatrix bitMatrix) throws FormatException {
|
||||
|
||||
if (version != null) {
|
||||
return version;
|
||||
|
@ -74,9 +74,9 @@ final class BitMatrixParser {
|
|||
* Data Matrix Code.</p>
|
||||
*
|
||||
* @return bytes encoded within the Data Matrix Code
|
||||
* @throws ReaderException if the exact number of bytes expected is not read
|
||||
* @throws FormatException if the exact number of bytes expected is not read
|
||||
*/
|
||||
byte[] readCodewords() throws ReaderException {
|
||||
byte[] readCodewords() throws FormatException {
|
||||
|
||||
byte[] result = new byte[version.getTotalCodewords()];
|
||||
int resultOffset = 0;
|
||||
|
@ -141,7 +141,7 @@ final class BitMatrixParser {
|
|||
} while ((row < numRows) || (column < numColumns));
|
||||
|
||||
if (resultOffset != version.getTotalCodewords()) {
|
||||
throw ReaderException.getInstance();
|
||||
throw FormatException.getFormatInstance();
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
|
|
@ -16,12 +16,12 @@
|
|||
|
||||
package com.google.zxing.datamatrix.decoder;
|
||||
|
||||
import com.google.zxing.ReaderException;
|
||||
import com.google.zxing.FormatException;
|
||||
import com.google.zxing.common.BitSource;
|
||||
import com.google.zxing.common.DecoderResult;
|
||||
|
||||
import java.util.Vector;
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.util.Vector;
|
||||
|
||||
/**
|
||||
* <p>Data Matrix Codes can encode text as bits in one of several modes, and can use multiple modes
|
||||
|
@ -75,7 +75,7 @@ final class DecodedBitStreamParser {
|
|||
private DecodedBitStreamParser() {
|
||||
}
|
||||
|
||||
static DecoderResult decode(byte[] bytes) throws ReaderException {
|
||||
static DecoderResult decode(byte[] bytes) throws FormatException {
|
||||
BitSource bits = new BitSource(bytes);
|
||||
StringBuffer result = new StringBuffer(100);
|
||||
StringBuffer resultTrailer = new StringBuffer(0);
|
||||
|
@ -102,7 +102,7 @@ final class DecodedBitStreamParser {
|
|||
decodeBase256Segment(bits, result, byteSegments);
|
||||
break;
|
||||
default:
|
||||
throw ReaderException.getInstance();
|
||||
throw FormatException.getFormatInstance();
|
||||
}
|
||||
mode = ASCII_ENCODE;
|
||||
}
|
||||
|
@ -117,12 +117,12 @@ final class DecodedBitStreamParser {
|
|||
* See ISO 16022:2006, 5.2.3 and Annex C, Table C.2
|
||||
*/
|
||||
private static int decodeAsciiSegment(BitSource bits, StringBuffer result, StringBuffer resultTrailer)
|
||||
throws ReaderException {
|
||||
throws FormatException {
|
||||
boolean upperShift = false;
|
||||
do {
|
||||
int oneByte = bits.readBits(8);
|
||||
if (oneByte == 0) {
|
||||
throw ReaderException.getInstance();
|
||||
throw FormatException.getFormatInstance();
|
||||
} else if (oneByte <= 128) { // ASCII data (ASCII value + 1)
|
||||
oneByte = upperShift ? (oneByte + 128) : oneByte;
|
||||
upperShift = false;
|
||||
|
@ -168,7 +168,7 @@ final class DecodedBitStreamParser {
|
|||
//throw ReaderException.getInstance();
|
||||
// Ignore this symbol for now
|
||||
} else if (oneByte >= 242) { // Not to be used in ASCII encodation
|
||||
throw ReaderException.getInstance();
|
||||
throw FormatException.getFormatInstance();
|
||||
}
|
||||
} while (bits.available() > 0);
|
||||
return ASCII_ENCODE;
|
||||
|
@ -177,7 +177,7 @@ final class DecodedBitStreamParser {
|
|||
/**
|
||||
* See ISO 16022:2006, 5.2.5 and Annex C, Table C.1
|
||||
*/
|
||||
private static void decodeC40Segment(BitSource bits, StringBuffer result) throws ReaderException {
|
||||
private static void decodeC40Segment(BitSource bits, StringBuffer result) throws FormatException {
|
||||
// Three C40 values are encoded in a 16-bit value as
|
||||
// (1600 * C1) + (40 * C2) + C3 + 1
|
||||
// TODO(bbrown): The Upper Shift with C40 doesn't work in the 4 value scenario all the time
|
||||
|
@ -230,11 +230,11 @@ final class DecodedBitStreamParser {
|
|||
result.append(C40_SHIFT2_SET_CHARS[cValue]);
|
||||
}
|
||||
} else if (cValue == 27) { // FNC1
|
||||
throw ReaderException.getInstance();
|
||||
throw FormatException.getFormatInstance();
|
||||
} else if (cValue == 30) { // Upper Shift
|
||||
upperShift = true;
|
||||
} else {
|
||||
throw ReaderException.getInstance();
|
||||
throw FormatException.getFormatInstance();
|
||||
}
|
||||
shift = 0;
|
||||
break;
|
||||
|
@ -248,7 +248,7 @@ final class DecodedBitStreamParser {
|
|||
shift = 0;
|
||||
break;
|
||||
default:
|
||||
throw ReaderException.getInstance();
|
||||
throw FormatException.getFormatInstance();
|
||||
}
|
||||
}
|
||||
} while (bits.available() > 0);
|
||||
|
@ -257,7 +257,7 @@ final class DecodedBitStreamParser {
|
|||
/**
|
||||
* See ISO 16022:2006, 5.2.6 and Annex C, Table C.2
|
||||
*/
|
||||
private static void decodeTextSegment(BitSource bits, StringBuffer result) throws ReaderException {
|
||||
private static void decodeTextSegment(BitSource bits, StringBuffer result) throws FormatException {
|
||||
// Three Text values are encoded in a 16-bit value as
|
||||
// (1600 * C1) + (40 * C2) + C3 + 1
|
||||
// TODO(bbrown): The Upper Shift with Text doesn't work in the 4 value scenario all the time
|
||||
|
@ -311,11 +311,11 @@ final class DecodedBitStreamParser {
|
|||
result.append(C40_SHIFT2_SET_CHARS[cValue]);
|
||||
}
|
||||
} else if (cValue == 27) { // FNC1
|
||||
throw ReaderException.getInstance();
|
||||
throw FormatException.getFormatInstance();
|
||||
} else if (cValue == 30) { // Upper Shift
|
||||
upperShift = true;
|
||||
} else {
|
||||
throw ReaderException.getInstance();
|
||||
throw FormatException.getFormatInstance();
|
||||
}
|
||||
shift = 0;
|
||||
break;
|
||||
|
@ -329,7 +329,7 @@ final class DecodedBitStreamParser {
|
|||
shift = 0;
|
||||
break;
|
||||
default:
|
||||
throw ReaderException.getInstance();
|
||||
throw FormatException.getFormatInstance();
|
||||
}
|
||||
}
|
||||
} while (bits.available() > 0);
|
||||
|
@ -338,7 +338,7 @@ final class DecodedBitStreamParser {
|
|||
/**
|
||||
* See ISO 16022:2006, 5.2.7
|
||||
*/
|
||||
private static void decodeAnsiX12Segment(BitSource bits, StringBuffer result) throws ReaderException {
|
||||
private static void decodeAnsiX12Segment(BitSource bits, StringBuffer result) throws FormatException {
|
||||
// Three ANSI X12 values are encoded in a 16-bit value as
|
||||
// (1600 * C1) + (40 * C2) + C3 + 1
|
||||
|
||||
|
@ -370,7 +370,7 @@ final class DecodedBitStreamParser {
|
|||
} else if (cValue < 40) { // A - Z
|
||||
result.append((char) (cValue + 51));
|
||||
} else {
|
||||
throw ReaderException.getInstance();
|
||||
throw FormatException.getFormatInstance();
|
||||
}
|
||||
}
|
||||
} while (bits.available() > 0);
|
||||
|
|
|
@ -16,7 +16,8 @@
|
|||
|
||||
package com.google.zxing.datamatrix.decoder;
|
||||
|
||||
import com.google.zxing.ReaderException;
|
||||
import com.google.zxing.ChecksumException;
|
||||
import com.google.zxing.FormatException;
|
||||
import com.google.zxing.common.BitMatrix;
|
||||
import com.google.zxing.common.DecoderResult;
|
||||
import com.google.zxing.common.reedsolomon.GF256;
|
||||
|
@ -43,9 +44,10 @@ public final class Decoder {
|
|||
*
|
||||
* @param image booleans representing white/black Data Matrix Code modules
|
||||
* @return text and bytes encoded within the Data Matrix Code
|
||||
* @throws ReaderException if the Data Matrix Code cannot be decoded
|
||||
* @throws FormatException if the Data Matrix Code cannot be decoded
|
||||
* @throws ChecksumException if error correction fails
|
||||
*/
|
||||
public DecoderResult decode(boolean[][] image) throws ReaderException {
|
||||
public DecoderResult decode(boolean[][] image) throws FormatException, ChecksumException {
|
||||
int dimension = image.length;
|
||||
BitMatrix bits = new BitMatrix(dimension);
|
||||
for (int i = 0; i < dimension; i++) {
|
||||
|
@ -64,9 +66,10 @@ public final class Decoder {
|
|||
*
|
||||
* @param bits booleans representing white/black Data Matrix Code modules
|
||||
* @return text and bytes encoded within the Data Matrix Code
|
||||
* @throws ReaderException if the Data Matrix Code cannot be decoded
|
||||
* @throws FormatException if the Data Matrix Code cannot be decoded
|
||||
* @throws ChecksumException if error correction fails
|
||||
*/
|
||||
public DecoderResult decode(BitMatrix bits) throws ReaderException {
|
||||
public DecoderResult decode(BitMatrix bits) throws FormatException, ChecksumException {
|
||||
|
||||
// Construct a parser and read version, error-correction level
|
||||
BitMatrixParser parser = new BitMatrixParser(bits);
|
||||
|
@ -106,9 +109,9 @@ public final class Decoder {
|
|||
*
|
||||
* @param codewordBytes data and error correction codewords
|
||||
* @param numDataCodewords number of codewords that are data bytes
|
||||
* @throws ReaderException if error correction fails
|
||||
* @throws ChecksumException if error correction fails
|
||||
*/
|
||||
private void correctErrors(byte[] codewordBytes, int numDataCodewords) throws ReaderException {
|
||||
private void correctErrors(byte[] codewordBytes, int numDataCodewords) throws ChecksumException {
|
||||
int numCodewords = codewordBytes.length;
|
||||
// First read into an array of ints
|
||||
int[] codewordsInts = new int[numCodewords];
|
||||
|
@ -119,7 +122,7 @@ public final class Decoder {
|
|||
try {
|
||||
rsDecoder.decode(codewordsInts, numECCodewords);
|
||||
} catch (ReedSolomonException rse) {
|
||||
throw ReaderException.getInstance();
|
||||
throw ChecksumException.getChecksumInstance();
|
||||
}
|
||||
// Copy back into array of bytes -- only need to worry about the bytes that were data
|
||||
// We don't care about errors in the error-correction codewords
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
|
||||
package com.google.zxing.datamatrix.decoder;
|
||||
|
||||
import com.google.zxing.ReaderException;
|
||||
import com.google.zxing.FormatException;
|
||||
|
||||
/**
|
||||
* The Version object encapsulates attributes about a particular
|
||||
|
@ -94,11 +94,11 @@ public final class Version {
|
|||
* @param numRows Number of rows in modules
|
||||
* @param numColumns Number of columns in modules
|
||||
* @return {@link Version} for a Data Matrix Code of those dimensions
|
||||
* @throws ReaderException if dimensions do correspond to a valid Data Matrix size
|
||||
* @throws FormatException if dimensions do correspond to a valid Data Matrix size
|
||||
*/
|
||||
public static Version getVersionForDimensions(int numRows, int numColumns) throws ReaderException {
|
||||
public static Version getVersionForDimensions(int numRows, int numColumns) throws FormatException {
|
||||
if ((numRows & 0x01) != 0 || (numColumns & 0x01) != 0) {
|
||||
throw ReaderException.getInstance();
|
||||
throw FormatException.getFormatInstance();
|
||||
}
|
||||
|
||||
// TODO(bbrown): This is doing a linear search through the array of versions.
|
||||
|
@ -112,7 +112,7 @@ public final class Version {
|
|||
}
|
||||
}
|
||||
|
||||
throw ReaderException.getInstance();
|
||||
throw FormatException.getFormatInstance();
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
|
||||
package com.google.zxing.datamatrix.detector;
|
||||
|
||||
import com.google.zxing.ReaderException;
|
||||
import com.google.zxing.NotFoundException;
|
||||
import com.google.zxing.ResultPoint;
|
||||
import com.google.zxing.common.BitMatrix;
|
||||
import com.google.zxing.common.Collections;
|
||||
|
@ -57,9 +57,9 @@ public final class Detector {
|
|||
* <p>Detects a Data Matrix Code in an image.</p>
|
||||
*
|
||||
* @return {@link DetectorResult} encapsulating results of detecting a QR Code
|
||||
* @throws ReaderException if no Data Matrix Code can be found
|
||||
* @throws NotFoundException if no Data Matrix Code can be found
|
||||
*/
|
||||
public DetectorResult detect() throws ReaderException {
|
||||
public DetectorResult detect() throws NotFoundException {
|
||||
|
||||
ResultPoint[] cornerPoints = rectangleDetector.detect();
|
||||
ResultPoint pointA = cornerPoints[0];
|
||||
|
@ -110,7 +110,7 @@ public final class Detector {
|
|||
}
|
||||
|
||||
if (maybeTopLeft == null || bottomLeft == null || maybeBottomRight == null) {
|
||||
throw ReaderException.getInstance();
|
||||
throw NotFoundException.getNotFoundInstance();
|
||||
}
|
||||
|
||||
// Bottom left is correct but top left and bottom right might be switched
|
||||
|
@ -169,7 +169,7 @@ public final class Detector {
|
|||
ResultPoint topLeft,
|
||||
ResultPoint bottomLeft,
|
||||
ResultPoint bottomRight,
|
||||
int dimension) throws ReaderException {
|
||||
int dimension) throws NotFoundException {
|
||||
|
||||
// We make up the top right point for now, based on the others.
|
||||
// TODO: we actually found a fourth corner above and figured out which of two modules
|
||||
|
|
|
@ -17,8 +17,10 @@
|
|||
package com.google.zxing.multi;
|
||||
|
||||
import com.google.zxing.BinaryBitmap;
|
||||
import com.google.zxing.ChecksumException;
|
||||
import com.google.zxing.FormatException;
|
||||
import com.google.zxing.NotFoundException;
|
||||
import com.google.zxing.Reader;
|
||||
import com.google.zxing.ReaderException;
|
||||
import com.google.zxing.Result;
|
||||
|
||||
import java.util.Hashtable;
|
||||
|
@ -40,11 +42,13 @@ public final class ByQuadrantReader implements Reader {
|
|||
this.delegate = delegate;
|
||||
}
|
||||
|
||||
public Result decode(BinaryBitmap image) throws ReaderException {
|
||||
public Result decode(BinaryBitmap image)
|
||||
throws NotFoundException, ChecksumException, FormatException {
|
||||
return decode(image, null);
|
||||
}
|
||||
|
||||
public Result decode(BinaryBitmap image, Hashtable hints) throws ReaderException {
|
||||
public Result decode(BinaryBitmap image, Hashtable hints)
|
||||
throws NotFoundException, ChecksumException, FormatException {
|
||||
|
||||
int width = image.getWidth();
|
||||
int height = image.getHeight();
|
||||
|
@ -54,28 +58,28 @@ public final class ByQuadrantReader implements Reader {
|
|||
BinaryBitmap topLeft = image.crop(0, 0, halfWidth, halfHeight);
|
||||
try {
|
||||
return delegate.decode(topLeft, hints);
|
||||
} catch (ReaderException re) {
|
||||
} catch (NotFoundException re) {
|
||||
// continue
|
||||
}
|
||||
|
||||
BinaryBitmap topRight = image.crop(halfWidth, 0, halfWidth, halfHeight);
|
||||
try {
|
||||
return delegate.decode(topRight, hints);
|
||||
} catch (ReaderException re) {
|
||||
} catch (NotFoundException re) {
|
||||
// continue
|
||||
}
|
||||
|
||||
BinaryBitmap bottomLeft = image.crop(0, halfHeight, halfWidth, halfHeight);
|
||||
try {
|
||||
return delegate.decode(bottomLeft, hints);
|
||||
} catch (ReaderException re) {
|
||||
} catch (NotFoundException re) {
|
||||
// continue
|
||||
}
|
||||
|
||||
BinaryBitmap bottomRight = image.crop(halfWidth, halfHeight, halfWidth, halfHeight);
|
||||
try {
|
||||
return delegate.decode(bottomRight, hints);
|
||||
} catch (ReaderException re) {
|
||||
} catch (NotFoundException re) {
|
||||
// continue
|
||||
}
|
||||
|
||||
|
|
|
@ -16,10 +16,11 @@
|
|||
|
||||
package com.google.zxing.multi;
|
||||
|
||||
import com.google.zxing.Reader;
|
||||
import com.google.zxing.Result;
|
||||
import com.google.zxing.BinaryBitmap;
|
||||
import com.google.zxing.NotFoundException;
|
||||
import com.google.zxing.Reader;
|
||||
import com.google.zxing.ReaderException;
|
||||
import com.google.zxing.Result;
|
||||
import com.google.zxing.ResultPoint;
|
||||
|
||||
import java.util.Hashtable;
|
||||
|
@ -49,16 +50,16 @@ public final class GenericMultipleBarcodeReader implements MultipleBarcodeReader
|
|||
this.delegate = delegate;
|
||||
}
|
||||
|
||||
public Result[] decodeMultiple(BinaryBitmap image) throws ReaderException {
|
||||
public Result[] decodeMultiple(BinaryBitmap image) throws NotFoundException {
|
||||
return decodeMultiple(image, null);
|
||||
}
|
||||
|
||||
public Result[] decodeMultiple(BinaryBitmap image, Hashtable hints)
|
||||
throws ReaderException {
|
||||
throws NotFoundException {
|
||||
Vector results = new Vector();
|
||||
doDecodeMultiple(image, hints, results, 0, 0);
|
||||
if (results.isEmpty()) {
|
||||
throw ReaderException.getInstance();
|
||||
throw NotFoundException.getNotFoundInstance();
|
||||
}
|
||||
int numResults = results.size();
|
||||
Result[] resultArray = new Result[numResults];
|
||||
|
|
|
@ -16,9 +16,9 @@
|
|||
|
||||
package com.google.zxing.multi;
|
||||
|
||||
import com.google.zxing.Result;
|
||||
import com.google.zxing.BinaryBitmap;
|
||||
import com.google.zxing.ReaderException;
|
||||
import com.google.zxing.NotFoundException;
|
||||
import com.google.zxing.Result;
|
||||
|
||||
import java.util.Hashtable;
|
||||
|
||||
|
@ -30,8 +30,8 @@ import java.util.Hashtable;
|
|||
*/
|
||||
public interface MultipleBarcodeReader {
|
||||
|
||||
Result[] decodeMultiple(BinaryBitmap image) throws ReaderException;
|
||||
Result[] decodeMultiple(BinaryBitmap image) throws NotFoundException;
|
||||
|
||||
Result[] decodeMultiple(BinaryBitmap image, Hashtable hints) throws ReaderException;
|
||||
Result[] decodeMultiple(BinaryBitmap image, Hashtable hints) throws NotFoundException;
|
||||
|
||||
}
|
||||
|
|
|
@ -18,6 +18,7 @@ package com.google.zxing.multi.qrcode;
|
|||
|
||||
import com.google.zxing.BarcodeFormat;
|
||||
import com.google.zxing.BinaryBitmap;
|
||||
import com.google.zxing.NotFoundException;
|
||||
import com.google.zxing.ReaderException;
|
||||
import com.google.zxing.Result;
|
||||
import com.google.zxing.ResultMetadataType;
|
||||
|
@ -41,11 +42,11 @@ public final class QRCodeMultiReader extends QRCodeReader implements MultipleBar
|
|||
|
||||
private static final Result[] EMPTY_RESULT_ARRAY = new Result[0];
|
||||
|
||||
public Result[] decodeMultiple(BinaryBitmap image) throws ReaderException {
|
||||
public Result[] decodeMultiple(BinaryBitmap image) throws NotFoundException {
|
||||
return decodeMultiple(image, null);
|
||||
}
|
||||
|
||||
public Result[] decodeMultiple(BinaryBitmap image, Hashtable hints) throws ReaderException {
|
||||
public Result[] decodeMultiple(BinaryBitmap image, Hashtable hints) throws NotFoundException {
|
||||
Vector results = new Vector();
|
||||
DetectorResult[] detectorResult = new MultiDetector(image.getBlackMatrix()).detectMulti(hints);
|
||||
for (int i = 0; i < detectorResult.length; i++) {
|
||||
|
|
|
@ -16,9 +16,10 @@
|
|||
|
||||
package com.google.zxing.multi.qrcode.detector;
|
||||
|
||||
import com.google.zxing.ReaderException;
|
||||
import com.google.zxing.common.DetectorResult;
|
||||
import com.google.zxing.FormatException;
|
||||
import com.google.zxing.NotFoundException;
|
||||
import com.google.zxing.common.BitMatrix;
|
||||
import com.google.zxing.common.DetectorResult;
|
||||
import com.google.zxing.qrcode.detector.Detector;
|
||||
import com.google.zxing.qrcode.detector.FinderPatternInfo;
|
||||
|
||||
|
@ -40,20 +41,20 @@ public final class MultiDetector extends Detector {
|
|||
super(image);
|
||||
}
|
||||
|
||||
public DetectorResult[] detectMulti(Hashtable hints) throws ReaderException {
|
||||
public DetectorResult[] detectMulti(Hashtable hints) throws NotFoundException {
|
||||
BitMatrix image = getImage();
|
||||
MultiFinderPatternFinder finder = new MultiFinderPatternFinder(image);
|
||||
FinderPatternInfo[] info = finder.findMulti(hints);
|
||||
|
||||
if (info == null || info.length == 0) {
|
||||
throw ReaderException.getInstance();
|
||||
throw NotFoundException.getNotFoundInstance();
|
||||
}
|
||||
|
||||
Vector result = new Vector();
|
||||
for (int i = 0; i < info.length; i++) {
|
||||
try {
|
||||
result.addElement(processFinderPatternInfo(info[i]));
|
||||
} catch (ReaderException e) {
|
||||
} catch (FormatException e) {
|
||||
// ignore
|
||||
}
|
||||
}
|
||||
|
|
|
@ -17,12 +17,12 @@
|
|||
package com.google.zxing.multi.qrcode.detector;
|
||||
|
||||
import com.google.zxing.DecodeHintType;
|
||||
import com.google.zxing.ReaderException;
|
||||
import com.google.zxing.NotFoundException;
|
||||
import com.google.zxing.ResultPoint;
|
||||
import com.google.zxing.ResultPointCallback;
|
||||
import com.google.zxing.common.BitMatrix;
|
||||
import com.google.zxing.common.Collections;
|
||||
import com.google.zxing.common.Comparator;
|
||||
import com.google.zxing.common.BitMatrix;
|
||||
import com.google.zxing.qrcode.detector.FinderPattern;
|
||||
import com.google.zxing.qrcode.detector.FinderPatternFinder;
|
||||
import com.google.zxing.qrcode.detector.FinderPatternInfo;
|
||||
|
@ -99,15 +99,15 @@ final class MultiFinderPatternFinder extends FinderPatternFinder {
|
|||
* @return the 3 best {@link FinderPattern}s from our list of candidates. The "best" are
|
||||
* those that have been detected at least {@link #CENTER_QUORUM} times, and whose module
|
||||
* size differs from the average among those patterns the least
|
||||
* @throws ReaderException if 3 such finder patterns do not exist
|
||||
* @throws NotFoundException if 3 such finder patterns do not exist
|
||||
*/
|
||||
private FinderPattern[][] selectBestPatterns() throws ReaderException {
|
||||
private FinderPattern[][] selectBestPatterns() throws NotFoundException {
|
||||
Vector possibleCenters = getPossibleCenters();
|
||||
int size = possibleCenters.size();
|
||||
|
||||
if (size < 3) {
|
||||
// Couldn't find enough finder patterns
|
||||
throw ReaderException.getInstance();
|
||||
throw NotFoundException.getNotFoundInstance();
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -227,10 +227,10 @@ final class MultiFinderPatternFinder extends FinderPatternFinder {
|
|||
}
|
||||
|
||||
// Nothing found!
|
||||
throw ReaderException.getInstance();
|
||||
throw NotFoundException.getNotFoundInstance();
|
||||
}
|
||||
|
||||
public FinderPatternInfo[] findMulti(Hashtable hints) throws ReaderException {
|
||||
public FinderPatternInfo[] findMulti(Hashtable hints) throws NotFoundException {
|
||||
boolean tryHarder = hints != null && hints.containsKey(DecodeHintType.TRY_HARDER);
|
||||
BitMatrix image = getImage();
|
||||
int maxI = image.getHeight();
|
||||
|
|
|
@ -17,7 +17,9 @@
|
|||
package com.google.zxing.oned;
|
||||
|
||||
import com.google.zxing.BarcodeFormat;
|
||||
import com.google.zxing.ReaderException;
|
||||
import com.google.zxing.ChecksumException;
|
||||
import com.google.zxing.FormatException;
|
||||
import com.google.zxing.NotFoundException;
|
||||
import com.google.zxing.Result;
|
||||
import com.google.zxing.ResultPoint;
|
||||
import com.google.zxing.common.BitArray;
|
||||
|
@ -161,7 +163,7 @@ public final class Code128Reader extends OneDReader {
|
|||
private static final int CODE_START_C = 105;
|
||||
private static final int CODE_STOP = 106;
|
||||
|
||||
private static int[] findStartPattern(BitArray row) throws ReaderException {
|
||||
private static int[] findStartPattern(BitArray row) throws NotFoundException {
|
||||
int width = row.getSize();
|
||||
int rowOffset = 0;
|
||||
while (rowOffset < width) {
|
||||
|
@ -214,10 +216,10 @@ public final class Code128Reader extends OneDReader {
|
|||
isWhite = !isWhite;
|
||||
}
|
||||
}
|
||||
throw ReaderException.getInstance();
|
||||
throw NotFoundException.getNotFoundInstance();
|
||||
}
|
||||
|
||||
private static int decodeCode(BitArray row, int[] counters, int rowOffset) throws ReaderException {
|
||||
private static int decodeCode(BitArray row, int[] counters, int rowOffset) throws NotFoundException {
|
||||
recordPattern(row, rowOffset, counters);
|
||||
int bestVariance = MAX_AVG_VARIANCE; // worst variance we'll accept
|
||||
int bestMatch = -1;
|
||||
|
@ -233,11 +235,12 @@ public final class Code128Reader extends OneDReader {
|
|||
if (bestMatch >= 0) {
|
||||
return bestMatch;
|
||||
} else {
|
||||
throw ReaderException.getInstance();
|
||||
throw NotFoundException.getNotFoundInstance();
|
||||
}
|
||||
}
|
||||
|
||||
public Result decodeRow(int rowNumber, BitArray row, Hashtable hints) throws ReaderException {
|
||||
public Result decodeRow(int rowNumber, BitArray row, Hashtable hints)
|
||||
throws NotFoundException, FormatException, ChecksumException {
|
||||
|
||||
int[] startPatternInfo = findStartPattern(row);
|
||||
int startCode = startPatternInfo[2];
|
||||
|
@ -253,7 +256,7 @@ public final class Code128Reader extends OneDReader {
|
|||
codeSet = CODE_CODE_C;
|
||||
break;
|
||||
default:
|
||||
throw ReaderException.getInstance();
|
||||
throw FormatException.getFormatInstance();
|
||||
}
|
||||
|
||||
boolean done = false;
|
||||
|
@ -303,7 +306,7 @@ public final class Code128Reader extends OneDReader {
|
|||
case CODE_START_A:
|
||||
case CODE_START_B:
|
||||
case CODE_START_C:
|
||||
throw ReaderException.getInstance();
|
||||
throw FormatException.getFormatInstance();
|
||||
}
|
||||
|
||||
switch (codeSet) {
|
||||
|
@ -426,14 +429,14 @@ public final class Code128Reader extends OneDReader {
|
|||
}
|
||||
if (!row.isRange(nextStart, Math.min(width, nextStart + (nextStart - lastStart) / 2),
|
||||
false)) {
|
||||
throw ReaderException.getInstance();
|
||||
throw NotFoundException.getNotFoundInstance();
|
||||
}
|
||||
|
||||
// Pull out from sum the value of the penultimate check code
|
||||
checksumTotal -= multiplier * lastCode;
|
||||
// lastCode is the checksum then:
|
||||
if (checksumTotal % 103 != lastCode) {
|
||||
throw ReaderException.getInstance();
|
||||
throw ChecksumException.getChecksumInstance();
|
||||
}
|
||||
|
||||
// Need to pull out the check digits from string
|
||||
|
@ -452,7 +455,7 @@ public final class Code128Reader extends OneDReader {
|
|||
|
||||
if (resultString.length() == 0) {
|
||||
// Almost surely a false positive
|
||||
throw ReaderException.getInstance();
|
||||
throw FormatException.getFormatInstance();
|
||||
}
|
||||
|
||||
float left = (float) (startPatternInfo[1] + startPatternInfo[0]) / 2.0f;
|
||||
|
|
|
@ -17,7 +17,9 @@
|
|||
package com.google.zxing.oned;
|
||||
|
||||
import com.google.zxing.BarcodeFormat;
|
||||
import com.google.zxing.ReaderException;
|
||||
import com.google.zxing.ChecksumException;
|
||||
import com.google.zxing.FormatException;
|
||||
import com.google.zxing.NotFoundException;
|
||||
import com.google.zxing.Result;
|
||||
import com.google.zxing.ResultPoint;
|
||||
import com.google.zxing.common.BitArray;
|
||||
|
@ -88,7 +90,8 @@ public final class Code39Reader extends OneDReader {
|
|||
this.extendedMode = extendedMode;
|
||||
}
|
||||
|
||||
public Result decodeRow(int rowNumber, BitArray row, Hashtable hints) throws ReaderException {
|
||||
public Result decodeRow(int rowNumber, BitArray row, Hashtable hints)
|
||||
throws NotFoundException, ChecksumException, FormatException {
|
||||
|
||||
int[] start = findAsteriskPattern(row);
|
||||
int nextStart = start[1];
|
||||
|
@ -107,7 +110,7 @@ public final class Code39Reader extends OneDReader {
|
|||
recordPattern(row, nextStart, counters);
|
||||
int pattern = toNarrowWidePattern(counters);
|
||||
if (pattern < 0) {
|
||||
throw ReaderException.getInstance();
|
||||
throw NotFoundException.getNotFoundInstance();
|
||||
}
|
||||
decodedChar = patternToChar(pattern);
|
||||
result.append(decodedChar);
|
||||
|
@ -131,7 +134,7 @@ public final class Code39Reader extends OneDReader {
|
|||
// If 50% of last pattern size, following last pattern, is not whitespace, fail
|
||||
// (but if it's whitespace to the very end of the image, that's OK)
|
||||
if (nextStart != end && whiteSpaceAfterEnd / 2 < lastPatternSize) {
|
||||
throw ReaderException.getInstance();
|
||||
throw NotFoundException.getNotFoundInstance();
|
||||
}
|
||||
|
||||
if (usingCheckDigit) {
|
||||
|
@ -141,7 +144,7 @@ public final class Code39Reader extends OneDReader {
|
|||
total += ALPHABET_STRING.indexOf(result.charAt(i));
|
||||
}
|
||||
if (total % 43 != ALPHABET_STRING.indexOf(result.charAt(max))) {
|
||||
throw ReaderException.getInstance();
|
||||
throw ChecksumException.getChecksumInstance();
|
||||
}
|
||||
result.deleteCharAt(max);
|
||||
}
|
||||
|
@ -153,7 +156,7 @@ public final class Code39Reader extends OneDReader {
|
|||
|
||||
if (resultString.length() == 0) {
|
||||
// Almost surely a false positive
|
||||
throw ReaderException.getInstance();
|
||||
throw NotFoundException.getNotFoundInstance();
|
||||
}
|
||||
|
||||
float left = (float) (start[1] + start[0]) / 2.0f;
|
||||
|
@ -168,7 +171,7 @@ public final class Code39Reader extends OneDReader {
|
|||
|
||||
}
|
||||
|
||||
private static int[] findAsteriskPattern(BitArray row) throws ReaderException {
|
||||
private static int[] findAsteriskPattern(BitArray row) throws NotFoundException {
|
||||
int width = row.getSize();
|
||||
int rowOffset = 0;
|
||||
while (rowOffset < width) {
|
||||
|
@ -210,7 +213,7 @@ public final class Code39Reader extends OneDReader {
|
|||
isWhite = !isWhite;
|
||||
}
|
||||
}
|
||||
throw ReaderException.getInstance();
|
||||
throw NotFoundException.getNotFoundInstance();
|
||||
}
|
||||
|
||||
// For efficiency, returns -1 on failure. Not throwing here saved as many as 700 exceptions
|
||||
|
@ -259,16 +262,16 @@ public final class Code39Reader extends OneDReader {
|
|||
return -1;
|
||||
}
|
||||
|
||||
private static char patternToChar(int pattern) throws ReaderException {
|
||||
private static char patternToChar(int pattern) throws NotFoundException {
|
||||
for (int i = 0; i < CHARACTER_ENCODINGS.length; i++) {
|
||||
if (CHARACTER_ENCODINGS[i] == pattern) {
|
||||
return ALPHABET[i];
|
||||
}
|
||||
}
|
||||
throw ReaderException.getInstance();
|
||||
throw NotFoundException.getNotFoundInstance();
|
||||
}
|
||||
|
||||
private static String decodeExtended(String encoded) throws ReaderException {
|
||||
private static String decodeExtended(String encoded) throws FormatException {
|
||||
int length = encoded.length();
|
||||
StringBuffer decoded = new StringBuffer(length);
|
||||
for (int i = 0; i < length; i++) {
|
||||
|
@ -282,7 +285,7 @@ public final class Code39Reader extends OneDReader {
|
|||
if (next >= 'A' && next <= 'Z') {
|
||||
decodedChar = (char) (next + 32);
|
||||
} else {
|
||||
throw ReaderException.getInstance();
|
||||
throw FormatException.getFormatInstance();
|
||||
}
|
||||
break;
|
||||
case '$':
|
||||
|
@ -290,7 +293,7 @@ public final class Code39Reader extends OneDReader {
|
|||
if (next >= 'A' && next <= 'Z') {
|
||||
decodedChar = (char) (next - 64);
|
||||
} else {
|
||||
throw ReaderException.getInstance();
|
||||
throw FormatException.getFormatInstance();
|
||||
}
|
||||
break;
|
||||
case '%':
|
||||
|
@ -300,7 +303,7 @@ public final class Code39Reader extends OneDReader {
|
|||
} else if (next >= 'F' && next <= 'W') {
|
||||
decodedChar = (char) (next - 11);
|
||||
} else {
|
||||
throw ReaderException.getInstance();
|
||||
throw FormatException.getFormatInstance();
|
||||
}
|
||||
break;
|
||||
case '/':
|
||||
|
@ -310,7 +313,7 @@ public final class Code39Reader extends OneDReader {
|
|||
} else if (next == 'Z') {
|
||||
decodedChar = ':';
|
||||
} else {
|
||||
throw ReaderException.getInstance();
|
||||
throw FormatException.getFormatInstance();
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
package com.google.zxing.oned;
|
||||
|
||||
import com.google.zxing.BarcodeFormat;
|
||||
import com.google.zxing.ReaderException;
|
||||
import com.google.zxing.NotFoundException;
|
||||
import com.google.zxing.common.BitArray;
|
||||
|
||||
/**
|
||||
|
@ -69,7 +69,7 @@ public final class EAN13Reader extends UPCEANReader {
|
|||
}
|
||||
|
||||
protected int decodeMiddle(BitArray row, int[] startRange, StringBuffer resultString)
|
||||
throws ReaderException {
|
||||
throws NotFoundException {
|
||||
int[] counters = decodeMiddleCounters;
|
||||
counters[0] = 0;
|
||||
counters[1] = 0;
|
||||
|
@ -119,17 +119,17 @@ public final class EAN13Reader extends UPCEANReader {
|
|||
* @param resultString string to insert decoded first digit into
|
||||
* @param lgPatternFound int whose bits indicates the pattern of odd/even L/G patterns used to
|
||||
* encode digits
|
||||
* @throws ReaderException if first digit cannot be determined
|
||||
* @throws NotFoundException if first digit cannot be determined
|
||||
*/
|
||||
private static void determineFirstDigit(StringBuffer resultString, int lgPatternFound)
|
||||
throws ReaderException {
|
||||
throws NotFoundException {
|
||||
for (int d = 0; d < 10; d++) {
|
||||
if (lgPatternFound == FIRST_DIGIT_ENCODINGS[d]) {
|
||||
resultString.insert(0, (char) ('0' + d));
|
||||
return;
|
||||
}
|
||||
}
|
||||
throw ReaderException.getInstance();
|
||||
throw NotFoundException.getNotFoundInstance();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
package com.google.zxing.oned;
|
||||
|
||||
import com.google.zxing.BarcodeFormat;
|
||||
import com.google.zxing.ReaderException;
|
||||
import com.google.zxing.NotFoundException;
|
||||
import com.google.zxing.common.BitArray;
|
||||
|
||||
/**
|
||||
|
@ -34,7 +34,7 @@ public final class EAN8Reader extends UPCEANReader {
|
|||
}
|
||||
|
||||
protected int decodeMiddle(BitArray row, int[] startRange, StringBuffer result)
|
||||
throws ReaderException {
|
||||
throws NotFoundException {
|
||||
int[] counters = decodeMiddleCounters;
|
||||
counters[0] = 0;
|
||||
counters[1] = 0;
|
||||
|
|
|
@ -18,7 +18,8 @@ package com.google.zxing.oned;
|
|||
|
||||
import com.google.zxing.BarcodeFormat;
|
||||
import com.google.zxing.DecodeHintType;
|
||||
import com.google.zxing.ReaderException;
|
||||
import com.google.zxing.FormatException;
|
||||
import com.google.zxing.NotFoundException;
|
||||
import com.google.zxing.Result;
|
||||
import com.google.zxing.ResultPoint;
|
||||
import com.google.zxing.common.BitArray;
|
||||
|
@ -75,7 +76,7 @@ public final class ITFReader extends OneDReader {
|
|||
{N, W, N, W, N} // 9
|
||||
};
|
||||
|
||||
public Result decodeRow(int rowNumber, BitArray row, Hashtable hints) throws ReaderException {
|
||||
public Result decodeRow(int rowNumber, BitArray row, Hashtable hints) throws FormatException, NotFoundException {
|
||||
|
||||
// Find out where the Middle section (payload) starts & ends
|
||||
int[] startRange = decodeStart(row);
|
||||
|
@ -106,7 +107,7 @@ public final class ITFReader extends OneDReader {
|
|||
|
||||
}
|
||||
if (!lengthOK) {
|
||||
throw ReaderException.getInstance();
|
||||
throw FormatException.getFormatInstance();
|
||||
}
|
||||
|
||||
return new Result(
|
||||
|
@ -121,10 +122,10 @@ public final class ITFReader extends OneDReader {
|
|||
* @param row row of black/white values to search
|
||||
* @param payloadStart offset of start pattern
|
||||
* @param resultString {@link StringBuffer} to append decoded chars to
|
||||
* @throws ReaderException if decoding could not complete successfully
|
||||
* @throws NotFoundException if decoding could not complete successfully
|
||||
*/
|
||||
private static void decodeMiddle(BitArray row, int payloadStart, int payloadEnd,
|
||||
StringBuffer resultString) throws ReaderException {
|
||||
StringBuffer resultString) throws NotFoundException {
|
||||
|
||||
// Digits are interleaved in pairs - 5 black lines for one digit, and the
|
||||
// 5
|
||||
|
@ -163,9 +164,9 @@ public final class ITFReader extends OneDReader {
|
|||
* @param row row of black/white values to search
|
||||
* @return Array, containing index of start of 'start block' and end of
|
||||
* 'start block'
|
||||
* @throws ReaderException
|
||||
* @throws NotFoundException
|
||||
*/
|
||||
int[] decodeStart(BitArray row) throws ReaderException {
|
||||
int[] decodeStart(BitArray row) throws NotFoundException {
|
||||
int endStart = skipWhiteSpace(row);
|
||||
int[] startPattern = findGuardPattern(row, endStart, START_PATTERN);
|
||||
|
||||
|
@ -192,9 +193,9 @@ public final class ITFReader extends OneDReader {
|
|||
*
|
||||
* @param row bit array representing the scanned barcode.
|
||||
* @param startPattern index into row of the start or end pattern.
|
||||
* @throws ReaderException if the quiet zone cannot be found, a ReaderException is thrown.
|
||||
* @throws NotFoundException if the quiet zone cannot be found, a ReaderException is thrown.
|
||||
*/
|
||||
private void validateQuietZone(BitArray row, int startPattern) throws ReaderException {
|
||||
private void validateQuietZone(BitArray row, int startPattern) throws NotFoundException {
|
||||
|
||||
int quietCount = this.narrowLineWidth * 10; // expect to find this many pixels of quiet zone
|
||||
|
||||
|
@ -206,7 +207,7 @@ public final class ITFReader extends OneDReader {
|
|||
}
|
||||
if (quietCount != 0) {
|
||||
// Unable to find the necessary number of quiet zone pixels.
|
||||
throw ReaderException.getInstance();
|
||||
throw NotFoundException.getNotFoundInstance();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -215,9 +216,9 @@ public final class ITFReader extends OneDReader {
|
|||
*
|
||||
* @param row row of black/white values to search
|
||||
* @return index of the first black line.
|
||||
* @throws ReaderException Throws exception if no black lines are found in the row
|
||||
* @throws NotFoundException Throws exception if no black lines are found in the row
|
||||
*/
|
||||
private static int skipWhiteSpace(BitArray row) throws ReaderException {
|
||||
private static int skipWhiteSpace(BitArray row) throws NotFoundException {
|
||||
int width = row.getSize();
|
||||
int endStart = 0;
|
||||
while (endStart < width) {
|
||||
|
@ -227,7 +228,7 @@ public final class ITFReader extends OneDReader {
|
|||
endStart++;
|
||||
}
|
||||
if (endStart == width) {
|
||||
throw ReaderException.getInstance();
|
||||
throw NotFoundException.getNotFoundInstance();
|
||||
}
|
||||
|
||||
return endStart;
|
||||
|
@ -239,10 +240,10 @@ public final class ITFReader extends OneDReader {
|
|||
* @param row row of black/white values to search
|
||||
* @return Array, containing index of start of 'end block' and end of 'end
|
||||
* block'
|
||||
* @throws ReaderException
|
||||
* @throws NotFoundException
|
||||
*/
|
||||
|
||||
int[] decodeEnd(BitArray row) throws ReaderException {
|
||||
int[] decodeEnd(BitArray row) throws NotFoundException {
|
||||
|
||||
// For convenience, reverse the row and then
|
||||
// search from 'the start' for the end block
|
||||
|
@ -277,9 +278,9 @@ public final class ITFReader extends OneDReader {
|
|||
* being searched for as a pattern
|
||||
* @return start/end horizontal offset of guard pattern, as an array of two
|
||||
* ints
|
||||
* @throws ReaderException if pattern is not found
|
||||
* @throws NotFoundException if pattern is not found
|
||||
*/
|
||||
private static int[] findGuardPattern(BitArray row, int rowOffset, int[] pattern) throws ReaderException {
|
||||
private static int[] findGuardPattern(BitArray row, int rowOffset, int[] pattern) throws NotFoundException {
|
||||
|
||||
// TODO: This is very similar to implementation in UPCEANReader. Consider if they can be
|
||||
// merged to a single method.
|
||||
|
@ -313,7 +314,7 @@ public final class ITFReader extends OneDReader {
|
|||
isWhite = !isWhite;
|
||||
}
|
||||
}
|
||||
throw ReaderException.getInstance();
|
||||
throw NotFoundException.getNotFoundInstance();
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -322,9 +323,9 @@ public final class ITFReader extends OneDReader {
|
|||
*
|
||||
* @param counters the counts of runs of observed black/white/black/... values
|
||||
* @return The decoded digit
|
||||
* @throws ReaderException if digit cannot be decoded
|
||||
* @throws NotFoundException if digit cannot be decoded
|
||||
*/
|
||||
private static int decodeDigit(int[] counters) throws ReaderException {
|
||||
private static int decodeDigit(int[] counters) throws NotFoundException {
|
||||
|
||||
int bestVariance = MAX_AVG_VARIANCE; // worst variance we'll accept
|
||||
int bestMatch = -1;
|
||||
|
@ -340,7 +341,7 @@ public final class ITFReader extends OneDReader {
|
|||
if (bestMatch >= 0) {
|
||||
return bestMatch;
|
||||
} else {
|
||||
throw ReaderException.getInstance();
|
||||
throw NotFoundException.getNotFoundInstance();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -18,11 +18,11 @@ package com.google.zxing.oned;
|
|||
|
||||
import com.google.zxing.BarcodeFormat;
|
||||
import com.google.zxing.DecodeHintType;
|
||||
import com.google.zxing.NotFoundException;
|
||||
import com.google.zxing.Reader;
|
||||
import com.google.zxing.ReaderException;
|
||||
import com.google.zxing.Result;
|
||||
import com.google.zxing.common.BitArray;
|
||||
import com.google.zxing.oned.rss.RSS14Reader;
|
||||
|
||||
import java.util.Hashtable;
|
||||
import java.util.Vector;
|
||||
|
@ -70,7 +70,7 @@ public final class MultiFormatOneDReader extends OneDReader {
|
|||
}
|
||||
}
|
||||
|
||||
public Result decodeRow(int rowNumber, BitArray row, Hashtable hints) throws ReaderException {
|
||||
public Result decodeRow(int rowNumber, BitArray row, Hashtable hints) throws NotFoundException {
|
||||
int size = readers.size();
|
||||
for (int i = 0; i < size; i++) {
|
||||
OneDReader reader = (OneDReader) readers.elementAt(i);
|
||||
|
@ -81,7 +81,7 @@ public final class MultiFormatOneDReader extends OneDReader {
|
|||
}
|
||||
}
|
||||
|
||||
throw ReaderException.getInstance();
|
||||
throw NotFoundException.getNotFoundInstance();
|
||||
}
|
||||
|
||||
public void reset() {
|
||||
|
|
|
@ -18,6 +18,7 @@ package com.google.zxing.oned;
|
|||
|
||||
import com.google.zxing.BarcodeFormat;
|
||||
import com.google.zxing.DecodeHintType;
|
||||
import com.google.zxing.NotFoundException;
|
||||
import com.google.zxing.Reader;
|
||||
import com.google.zxing.ReaderException;
|
||||
import com.google.zxing.Result;
|
||||
|
@ -62,7 +63,7 @@ public final class MultiFormatUPCEANReader extends OneDReader {
|
|||
}
|
||||
}
|
||||
|
||||
public Result decodeRow(int rowNumber, BitArray row, Hashtable hints) throws ReaderException {
|
||||
public Result decodeRow(int rowNumber, BitArray row, Hashtable hints) throws NotFoundException {
|
||||
// Compute this location once and reuse it on multiple implementations
|
||||
int[] startGuardPattern = UPCEANReader.findStartGuardPattern(row);
|
||||
int size = readers.size();
|
||||
|
@ -92,7 +93,7 @@ public final class MultiFormatUPCEANReader extends OneDReader {
|
|||
return result;
|
||||
}
|
||||
|
||||
throw ReaderException.getInstance();
|
||||
throw NotFoundException.getNotFoundInstance();
|
||||
}
|
||||
|
||||
public void reset() {
|
||||
|
|
|
@ -17,7 +17,10 @@
|
|||
package com.google.zxing.oned;
|
||||
|
||||
import com.google.zxing.BinaryBitmap;
|
||||
import com.google.zxing.ChecksumException;
|
||||
import com.google.zxing.DecodeHintType;
|
||||
import com.google.zxing.FormatException;
|
||||
import com.google.zxing.NotFoundException;
|
||||
import com.google.zxing.Reader;
|
||||
import com.google.zxing.ReaderException;
|
||||
import com.google.zxing.Result;
|
||||
|
@ -40,15 +43,15 @@ public abstract class OneDReader implements Reader {
|
|||
private static final int INTEGER_MATH_SHIFT = 8;
|
||||
protected static final int PATTERN_MATCH_RESULT_SCALE_FACTOR = 1 << INTEGER_MATH_SHIFT;
|
||||
|
||||
public Result decode(BinaryBitmap image) throws ReaderException {
|
||||
public Result decode(BinaryBitmap image) throws NotFoundException, FormatException {
|
||||
return decode(image, null);
|
||||
}
|
||||
|
||||
// Note that we don't try rotation without the try harder flag, even if rotation was supported.
|
||||
public Result decode(BinaryBitmap image, Hashtable hints) throws ReaderException {
|
||||
public Result decode(BinaryBitmap image, Hashtable hints) throws NotFoundException, FormatException {
|
||||
try {
|
||||
return doDecode(image, hints);
|
||||
} catch (ReaderException re) {
|
||||
} catch (NotFoundException nfe) {
|
||||
boolean tryHarder = hints != null && hints.containsKey(DecodeHintType.TRY_HARDER);
|
||||
if (tryHarder && image.isRotateSupported()) {
|
||||
BinaryBitmap rotatedImage = image.rotateCounterClockwise();
|
||||
|
@ -70,7 +73,7 @@ public abstract class OneDReader implements Reader {
|
|||
}
|
||||
return result;
|
||||
} else {
|
||||
throw re;
|
||||
throw nfe;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -91,9 +94,9 @@ public abstract class OneDReader implements Reader {
|
|||
* @param image The image to decode
|
||||
* @param hints Any hints that were requested
|
||||
* @return The contents of the decoded barcode
|
||||
* @throws ReaderException Any spontaneous errors which occur
|
||||
* @throws NotFoundException Any spontaneous errors which occur
|
||||
*/
|
||||
private Result doDecode(BinaryBitmap image, Hashtable hints) throws ReaderException {
|
||||
private Result doDecode(BinaryBitmap image, Hashtable hints) throws NotFoundException {
|
||||
int width = image.getWidth();
|
||||
int height = image.getHeight();
|
||||
BitArray row = new BitArray(width);
|
||||
|
@ -122,7 +125,7 @@ public abstract class OneDReader implements Reader {
|
|||
// Estimate black point for this row and load it:
|
||||
try {
|
||||
row = image.getBlackRow(rowNumber, row);
|
||||
} catch (ReaderException re) {
|
||||
} catch (NotFoundException nfe) {
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -166,7 +169,7 @@ public abstract class OneDReader implements Reader {
|
|||
}
|
||||
}
|
||||
|
||||
throw ReaderException.getInstance();
|
||||
throw NotFoundException.getNotFoundInstance();
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -179,17 +182,17 @@ public abstract class OneDReader implements Reader {
|
|||
* @param row row to count from
|
||||
* @param start offset into row to start at
|
||||
* @param counters array into which to record counts
|
||||
* @throws ReaderException if counters cannot be filled entirely from row before running out
|
||||
* @throws NotFoundException if counters cannot be filled entirely from row before running out
|
||||
* of pixels
|
||||
*/
|
||||
protected static void recordPattern(BitArray row, int start, int[] counters) throws ReaderException {
|
||||
protected static void recordPattern(BitArray row, int start, int[] counters) throws NotFoundException {
|
||||
int numCounters = counters.length;
|
||||
for (int i = 0; i < numCounters; i++) {
|
||||
counters[i] = 0;
|
||||
}
|
||||
int end = row.getSize();
|
||||
if (start >= end) {
|
||||
throw ReaderException.getInstance();
|
||||
throw NotFoundException.getNotFoundInstance();
|
||||
}
|
||||
boolean isWhite = !row.get(start);
|
||||
int counterPosition = 0;
|
||||
|
@ -212,12 +215,12 @@ public abstract class OneDReader implements Reader {
|
|||
// If we read fully the last section of pixels and filled up our counters -- or filled
|
||||
// the last counter but ran off the side of the image, OK. Otherwise, a problem.
|
||||
if (!(counterPosition == numCounters || (counterPosition == numCounters - 1 && i == end))) {
|
||||
throw ReaderException.getInstance();
|
||||
throw NotFoundException.getNotFoundInstance();
|
||||
}
|
||||
}
|
||||
|
||||
protected static void recordPatternInReverse(BitArray row, int start, int[] counters)
|
||||
throws ReaderException {
|
||||
throws NotFoundException {
|
||||
// This could be more efficient I guess
|
||||
int numTransitionsLeft = counters.length;
|
||||
boolean last = row.get(start);
|
||||
|
@ -228,7 +231,7 @@ public abstract class OneDReader implements Reader {
|
|||
}
|
||||
}
|
||||
if (numTransitionsLeft >= 0) {
|
||||
throw ReaderException.getInstance();
|
||||
throw NotFoundException.getNotFoundInstance();
|
||||
}
|
||||
recordPattern(row, start + 1, counters);
|
||||
}
|
||||
|
@ -286,9 +289,9 @@ public abstract class OneDReader implements Reader {
|
|||
* @param row the black/white pixel data of the row
|
||||
* @param hints decode hints
|
||||
* @return {@link Result} containing encoded string and start/end of barcode
|
||||
* @throws ReaderException if an error occurs or barcode cannot be found
|
||||
* @throws NotFoundException if an error occurs or barcode cannot be found
|
||||
*/
|
||||
public abstract Result decodeRow(int rowNumber, BitArray row, Hashtable hints)
|
||||
throws ReaderException;
|
||||
throws NotFoundException, ChecksumException, FormatException;
|
||||
|
||||
}
|
||||
|
|
|
@ -17,9 +17,11 @@
|
|||
package com.google.zxing.oned;
|
||||
|
||||
import com.google.zxing.BarcodeFormat;
|
||||
import com.google.zxing.ReaderException;
|
||||
import com.google.zxing.Result;
|
||||
import com.google.zxing.BinaryBitmap;
|
||||
import com.google.zxing.ChecksumException;
|
||||
import com.google.zxing.FormatException;
|
||||
import com.google.zxing.NotFoundException;
|
||||
import com.google.zxing.Result;
|
||||
import com.google.zxing.common.BitArray;
|
||||
|
||||
import java.util.Hashtable;
|
||||
|
@ -35,19 +37,20 @@ public final class UPCAReader extends UPCEANReader {
|
|||
private final UPCEANReader ean13Reader = new EAN13Reader();
|
||||
|
||||
public Result decodeRow(int rowNumber, BitArray row, int[] startGuardRange, Hashtable hints)
|
||||
throws ReaderException {
|
||||
throws NotFoundException, FormatException, ChecksumException {
|
||||
return maybeReturnResult(ean13Reader.decodeRow(rowNumber, row, startGuardRange, hints));
|
||||
}
|
||||
|
||||
public Result decodeRow(int rowNumber, BitArray row, Hashtable hints) throws ReaderException {
|
||||
public Result decodeRow(int rowNumber, BitArray row, Hashtable hints)
|
||||
throws NotFoundException, FormatException, ChecksumException {
|
||||
return maybeReturnResult(ean13Reader.decodeRow(rowNumber, row, hints));
|
||||
}
|
||||
|
||||
public Result decode(BinaryBitmap image) throws ReaderException {
|
||||
public Result decode(BinaryBitmap image) throws NotFoundException, FormatException {
|
||||
return maybeReturnResult(ean13Reader.decode(image));
|
||||
}
|
||||
|
||||
public Result decode(BinaryBitmap image, Hashtable hints) throws ReaderException {
|
||||
public Result decode(BinaryBitmap image, Hashtable hints) throws NotFoundException, FormatException {
|
||||
return maybeReturnResult(ean13Reader.decode(image, hints));
|
||||
}
|
||||
|
||||
|
@ -56,16 +59,16 @@ public final class UPCAReader extends UPCEANReader {
|
|||
}
|
||||
|
||||
protected int decodeMiddle(BitArray row, int[] startRange, StringBuffer resultString)
|
||||
throws ReaderException {
|
||||
throws NotFoundException {
|
||||
return ean13Reader.decodeMiddle(row, startRange, resultString);
|
||||
}
|
||||
|
||||
private static Result maybeReturnResult(Result result) throws ReaderException {
|
||||
private static Result maybeReturnResult(Result result) throws FormatException {
|
||||
String text = result.getText();
|
||||
if (text.charAt(0) == '0') {
|
||||
return new Result(text.substring(1), null, result.getResultPoints(), BarcodeFormat.UPC_A);
|
||||
} else {
|
||||
throw ReaderException.getInstance();
|
||||
throw FormatException.getFormatInstance();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -16,12 +16,14 @@
|
|||
|
||||
package com.google.zxing.oned;
|
||||
|
||||
import com.google.zxing.ReaderException;
|
||||
import com.google.zxing.Result;
|
||||
import com.google.zxing.ResultPointCallback;
|
||||
import com.google.zxing.DecodeHintType;
|
||||
import com.google.zxing.ResultPoint;
|
||||
import com.google.zxing.BarcodeFormat;
|
||||
import com.google.zxing.ChecksumException;
|
||||
import com.google.zxing.DecodeHintType;
|
||||
import com.google.zxing.FormatException;
|
||||
import com.google.zxing.NotFoundException;
|
||||
import com.google.zxing.Result;
|
||||
import com.google.zxing.ResultPoint;
|
||||
import com.google.zxing.ResultPointCallback;
|
||||
import com.google.zxing.common.BitArray;
|
||||
|
||||
import java.util.Hashtable;
|
||||
|
@ -94,7 +96,7 @@ public abstract class UPCEANReader extends OneDReader {
|
|||
decodeRowStringBuffer = new StringBuffer(20);
|
||||
}
|
||||
|
||||
static int[] findStartGuardPattern(BitArray row) throws ReaderException {
|
||||
static int[] findStartGuardPattern(BitArray row) throws NotFoundException {
|
||||
boolean foundStart = false;
|
||||
int[] startRange = null;
|
||||
int nextStart = 0;
|
||||
|
@ -113,7 +115,8 @@ public abstract class UPCEANReader extends OneDReader {
|
|||
return startRange;
|
||||
}
|
||||
|
||||
public Result decodeRow(int rowNumber, BitArray row, Hashtable hints) throws ReaderException {
|
||||
public Result decodeRow(int rowNumber, BitArray row, Hashtable hints)
|
||||
throws NotFoundException, ChecksumException, FormatException {
|
||||
return decodeRow(rowNumber, row, findStartGuardPattern(row), hints);
|
||||
}
|
||||
|
||||
|
@ -123,7 +126,7 @@ public abstract class UPCEANReader extends OneDReader {
|
|||
* found. This allows this to be computed once and reused across many implementations.</p>
|
||||
*/
|
||||
public Result decodeRow(int rowNumber, BitArray row, int[] startGuardRange, Hashtable hints)
|
||||
throws ReaderException {
|
||||
throws NotFoundException, ChecksumException, FormatException {
|
||||
|
||||
ResultPointCallback resultPointCallback = hints == null ? null :
|
||||
(ResultPointCallback) hints.get(DecodeHintType.NEED_RESULT_POINT_CALLBACK);
|
||||
|
@ -158,12 +161,12 @@ public abstract class UPCEANReader extends OneDReader {
|
|||
int end = endRange[1];
|
||||
int quietEnd = end + (end - endRange[0]);
|
||||
if (quietEnd >= row.getSize() || !row.isRange(end, quietEnd, false)) {
|
||||
throw ReaderException.getInstance();
|
||||
throw NotFoundException.getNotFoundInstance();
|
||||
}
|
||||
|
||||
String resultString = result.toString();
|
||||
if (!checkChecksum(resultString)) {
|
||||
throw ReaderException.getInstance();
|
||||
throw ChecksumException.getChecksumInstance();
|
||||
}
|
||||
|
||||
float left = (float) (startGuardRange[1] + startGuardRange[0]) / 2.0f;
|
||||
|
@ -179,7 +182,7 @@ public abstract class UPCEANReader extends OneDReader {
|
|||
/**
|
||||
* @return {@link #checkStandardUPCEANChecksum(String)}
|
||||
*/
|
||||
boolean checkChecksum(String s) throws ReaderException {
|
||||
boolean checkChecksum(String s) throws ChecksumException, FormatException {
|
||||
return checkStandardUPCEANChecksum(s);
|
||||
}
|
||||
|
||||
|
@ -189,9 +192,10 @@ public abstract class UPCEANReader extends OneDReader {
|
|||
*
|
||||
* @param s string of digits to check
|
||||
* @return true iff string of digits passes the UPC/EAN checksum algorithm
|
||||
* @throws ReaderException if the string does not contain only digits
|
||||
* @throws FormatException if the string does not contain only digits
|
||||
* @throws ChecksumException if checksum mismatches
|
||||
*/
|
||||
private static boolean checkStandardUPCEANChecksum(String s) throws ReaderException {
|
||||
private static boolean checkStandardUPCEANChecksum(String s) throws ChecksumException, FormatException {
|
||||
int length = s.length();
|
||||
if (length == 0) {
|
||||
return false;
|
||||
|
@ -201,7 +205,7 @@ public abstract class UPCEANReader extends OneDReader {
|
|||
for (int i = length - 2; i >= 0; i -= 2) {
|
||||
int digit = (int) s.charAt(i) - (int) '0';
|
||||
if (digit < 0 || digit > 9) {
|
||||
throw ReaderException.getInstance();
|
||||
throw FormatException.getFormatInstance();
|
||||
}
|
||||
sum += digit;
|
||||
}
|
||||
|
@ -209,14 +213,14 @@ public abstract class UPCEANReader extends OneDReader {
|
|||
for (int i = length - 1; i >= 0; i -= 2) {
|
||||
int digit = (int) s.charAt(i) - (int) '0';
|
||||
if (digit < 0 || digit > 9) {
|
||||
throw ReaderException.getInstance();
|
||||
throw ChecksumException.getChecksumInstance();
|
||||
}
|
||||
sum += digit;
|
||||
}
|
||||
return sum % 10 == 0;
|
||||
}
|
||||
|
||||
int[] decodeEnd(BitArray row, int endStart) throws ReaderException {
|
||||
int[] decodeEnd(BitArray row, int endStart) throws NotFoundException {
|
||||
return findGuardPattern(row, endStart, false, START_END_PATTERN);
|
||||
}
|
||||
|
||||
|
@ -228,10 +232,10 @@ public abstract class UPCEANReader extends OneDReader {
|
|||
* @param pattern pattern of counts of number of black and white pixels that are being
|
||||
* searched for as a pattern
|
||||
* @return start/end horizontal offset of guard pattern, as an array of two ints
|
||||
* @throws ReaderException if pattern is not found
|
||||
* @throws NotFoundException if pattern is not found
|
||||
*/
|
||||
static int[] findGuardPattern(BitArray row, int rowOffset, boolean whiteFirst, int[] pattern)
|
||||
throws ReaderException {
|
||||
throws NotFoundException {
|
||||
int patternLength = pattern.length;
|
||||
int[] counters = new int[patternLength];
|
||||
int width = row.getSize();
|
||||
|
@ -269,7 +273,7 @@ public abstract class UPCEANReader extends OneDReader {
|
|||
isWhite = !isWhite;
|
||||
}
|
||||
}
|
||||
throw ReaderException.getInstance();
|
||||
throw NotFoundException.getNotFoundInstance();
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -282,10 +286,10 @@ public abstract class UPCEANReader extends OneDReader {
|
|||
* for the digits 0-9 are used, and this indicates the encodings for 0 to 9 that should
|
||||
* be used
|
||||
* @return horizontal offset of first pixel beyond the decoded digit
|
||||
* @throws ReaderException if digit cannot be decoded
|
||||
* @throws NotFoundException if digit cannot be decoded
|
||||
*/
|
||||
static int decodeDigit(BitArray row, int[] counters, int rowOffset, int[][] patterns)
|
||||
throws ReaderException {
|
||||
throws NotFoundException {
|
||||
recordPattern(row, rowOffset, counters);
|
||||
int bestVariance = MAX_AVG_VARIANCE; // worst variance we'll accept
|
||||
int bestMatch = -1;
|
||||
|
@ -301,7 +305,7 @@ public abstract class UPCEANReader extends OneDReader {
|
|||
if (bestMatch >= 0) {
|
||||
return bestMatch;
|
||||
} else {
|
||||
throw ReaderException.getInstance();
|
||||
throw NotFoundException.getNotFoundInstance();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -320,9 +324,9 @@ public abstract class UPCEANReader extends OneDReader {
|
|||
* @param startRange start/end offset of start guard pattern
|
||||
* @param resultString {@link StringBuffer} to append decoded chars to
|
||||
* @return horizontal offset of first pixel after the "middle" that was decoded
|
||||
* @throws ReaderException if decoding could not complete successfully
|
||||
* @throws NotFoundException if decoding could not complete successfully
|
||||
*/
|
||||
protected abstract int decodeMiddle(BitArray row, int[] startRange, StringBuffer resultString)
|
||||
throws ReaderException;
|
||||
throws NotFoundException;
|
||||
|
||||
}
|
||||
|
|
|
@ -17,7 +17,9 @@
|
|||
package com.google.zxing.oned;
|
||||
|
||||
import com.google.zxing.BarcodeFormat;
|
||||
import com.google.zxing.ReaderException;
|
||||
import com.google.zxing.ChecksumException;
|
||||
import com.google.zxing.FormatException;
|
||||
import com.google.zxing.NotFoundException;
|
||||
import com.google.zxing.common.BitArray;
|
||||
|
||||
/**
|
||||
|
@ -53,7 +55,7 @@ public final class UPCEReader extends UPCEANReader {
|
|||
}
|
||||
|
||||
protected int decodeMiddle(BitArray row, int[] startRange, StringBuffer result)
|
||||
throws ReaderException {
|
||||
throws NotFoundException {
|
||||
int[] counters = decodeMiddleCounters;
|
||||
counters[0] = 0;
|
||||
counters[1] = 0;
|
||||
|
@ -80,16 +82,16 @@ public final class UPCEReader extends UPCEANReader {
|
|||
return rowOffset;
|
||||
}
|
||||
|
||||
protected int[] decodeEnd(BitArray row, int endStart) throws ReaderException {
|
||||
protected int[] decodeEnd(BitArray row, int endStart) throws NotFoundException {
|
||||
return findGuardPattern(row, endStart, true, MIDDLE_END_PATTERN);
|
||||
}
|
||||
|
||||
protected boolean checkChecksum(String s) throws ReaderException {
|
||||
protected boolean checkChecksum(String s) throws FormatException, ChecksumException {
|
||||
return super.checkChecksum(convertUPCEtoUPCA(s));
|
||||
}
|
||||
|
||||
private static void determineNumSysAndCheckDigit(StringBuffer resultString, int lgPatternFound)
|
||||
throws ReaderException {
|
||||
throws NotFoundException {
|
||||
|
||||
for (int numSys = 0; numSys <= 1; numSys++) {
|
||||
for (int d = 0; d < 10; d++) {
|
||||
|
@ -100,7 +102,7 @@ public final class UPCEReader extends UPCEANReader {
|
|||
}
|
||||
}
|
||||
}
|
||||
throw ReaderException.getInstance();
|
||||
throw NotFoundException.getNotFoundInstance();
|
||||
}
|
||||
|
||||
BarcodeFormat getBarcodeFormat() {
|
||||
|
|
|
@ -19,8 +19,9 @@ package com.google.zxing.pdf417;
|
|||
import com.google.zxing.BarcodeFormat;
|
||||
import com.google.zxing.BinaryBitmap;
|
||||
import com.google.zxing.DecodeHintType;
|
||||
import com.google.zxing.FormatException;
|
||||
import com.google.zxing.NotFoundException;
|
||||
import com.google.zxing.Reader;
|
||||
import com.google.zxing.ReaderException;
|
||||
import com.google.zxing.Result;
|
||||
import com.google.zxing.ResultPoint;
|
||||
import com.google.zxing.common.BitMatrix;
|
||||
|
@ -46,14 +47,15 @@ public final class PDF417Reader implements Reader {
|
|||
* Locates and decodes a PDF417 code in an image.
|
||||
*
|
||||
* @return a String representing the content encoded by the PDF417 code
|
||||
* @throws ReaderException if a PDF417 code cannot be found, or cannot be decoded
|
||||
* @throws NotFoundException if a PDF417 code cannot be found,
|
||||
* @throws FormatException if a PDF417 cannot be decoded
|
||||
*/
|
||||
public Result decode(BinaryBitmap image) throws ReaderException {
|
||||
public Result decode(BinaryBitmap image) throws NotFoundException, FormatException {
|
||||
return decode(image, null);
|
||||
}
|
||||
|
||||
public Result decode(BinaryBitmap image, Hashtable hints)
|
||||
throws ReaderException {
|
||||
throws NotFoundException, FormatException {
|
||||
DecoderResult decoderResult;
|
||||
ResultPoint[] points;
|
||||
if (hints != null && hints.containsKey(DecodeHintType.PURE_BARCODE)) {
|
||||
|
@ -79,7 +81,7 @@ public final class PDF417Reader implements Reader {
|
|||
* around it. This is a specialized method that works exceptionally fast in this special
|
||||
* case.
|
||||
*/
|
||||
private static BitMatrix extractPureBits(BinaryBitmap image) throws ReaderException {
|
||||
private static BitMatrix extractPureBits(BinaryBitmap image) throws NotFoundException {
|
||||
// Now need to determine module size in pixels
|
||||
BitMatrix matrix = image.getBlackMatrix();
|
||||
int height = matrix.getHeight();
|
||||
|
@ -92,7 +94,7 @@ public final class PDF417Reader implements Reader {
|
|||
borderWidth++;
|
||||
}
|
||||
if (borderWidth == minDimension) {
|
||||
throw ReaderException.getInstance();
|
||||
throw NotFoundException.getNotFoundInstance();
|
||||
}
|
||||
|
||||
// And then keep tracking across the top-left black module to determine module size
|
||||
|
@ -101,7 +103,7 @@ public final class PDF417Reader implements Reader {
|
|||
moduleEnd++;
|
||||
}
|
||||
if (moduleEnd == minDimension) {
|
||||
throw ReaderException.getInstance();
|
||||
throw NotFoundException.getNotFoundInstance();
|
||||
}
|
||||
|
||||
int moduleSize = moduleEnd - borderWidth;
|
||||
|
@ -112,13 +114,13 @@ public final class PDF417Reader implements Reader {
|
|||
rowEndOfSymbol--;
|
||||
}
|
||||
if (rowEndOfSymbol < 0) {
|
||||
throw ReaderException.getInstance();
|
||||
throw NotFoundException.getNotFoundInstance();
|
||||
}
|
||||
rowEndOfSymbol++;
|
||||
|
||||
// Make sure width of barcode is a multiple of module size
|
||||
if ((rowEndOfSymbol - borderWidth) % moduleSize != 0) {
|
||||
throw ReaderException.getInstance();
|
||||
throw NotFoundException.getNotFoundInstance();
|
||||
}
|
||||
int dimension = (rowEndOfSymbol - borderWidth) / moduleSize;
|
||||
|
||||
|
@ -129,7 +131,7 @@ public final class PDF417Reader implements Reader {
|
|||
|
||||
int sampleDimension = borderWidth + (dimension - 1) * moduleSize;
|
||||
if (sampleDimension >= width || sampleDimension >= height) {
|
||||
throw ReaderException.getInstance();
|
||||
throw NotFoundException.getNotFoundInstance();
|
||||
}
|
||||
|
||||
// Now just read off the bits
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
|
||||
package com.google.zxing.pdf417.decoder;
|
||||
|
||||
import com.google.zxing.ReaderException;
|
||||
import com.google.zxing.NotFoundException;
|
||||
import com.google.zxing.common.BitMatrix;
|
||||
|
||||
/**
|
||||
|
@ -379,7 +379,7 @@ final class BitMatrixParser {
|
|||
* @param next the next available index into the codewords array.
|
||||
* @return the next available index into the codeword array after processing
|
||||
* this row.
|
||||
* @throws ReaderException
|
||||
* @throws NotFoundException
|
||||
*/
|
||||
/*
|
||||
int processRow1(int[] rowCounters, int rowNumber, int rowHeight,
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
|
||||
package com.google.zxing.pdf417.decoder;
|
||||
|
||||
import com.google.zxing.ReaderException;
|
||||
import com.google.zxing.FormatException;
|
||||
import com.google.zxing.common.DecoderResult;
|
||||
|
||||
/**
|
||||
|
@ -81,7 +81,7 @@ final class DecodedBitStreamParser {
|
|||
private DecodedBitStreamParser() {
|
||||
}
|
||||
|
||||
static DecoderResult decode(int[] codewords) throws ReaderException {
|
||||
static DecoderResult decode(int[] codewords) throws FormatException {
|
||||
StringBuffer result = new StringBuffer(100);
|
||||
// Get compaction mode
|
||||
int codeIndex = 1;
|
||||
|
@ -120,7 +120,7 @@ final class DecodedBitStreamParser {
|
|||
if (codeIndex < codewords.length) {
|
||||
code = codewords[codeIndex++];
|
||||
} else {
|
||||
throw ReaderException.getInstance();
|
||||
throw FormatException.getFormatInstance();
|
||||
}
|
||||
}
|
||||
return new DecoderResult(null, result.toString(), null, null);
|
||||
|
|
|
@ -16,7 +16,9 @@
|
|||
|
||||
package com.google.zxing.pdf417.decoder;
|
||||
|
||||
import com.google.zxing.ReaderException;
|
||||
import com.google.zxing.ChecksumException;
|
||||
import com.google.zxing.FormatException;
|
||||
import com.google.zxing.NotFoundException;
|
||||
import com.google.zxing.common.BitMatrix;
|
||||
import com.google.zxing.common.DecoderResult;
|
||||
//import com.google.zxing.pdf417.reedsolomon.ReedSolomonDecoder;
|
||||
|
@ -44,9 +46,9 @@ public final class Decoder {
|
|||
*
|
||||
* @param image booleans representing white/black PDF417 modules
|
||||
* @return text and bytes encoded within the PDF417 Code
|
||||
* @throws ReaderException if the PDF417 Code cannot be decoded
|
||||
* @throws NotFoundException if the PDF417 Code cannot be decoded
|
||||
*/
|
||||
public DecoderResult decode(boolean[][] image) throws ReaderException {
|
||||
public DecoderResult decode(boolean[][] image) throws FormatException {
|
||||
int dimension = image.length;
|
||||
BitMatrix bits = new BitMatrix(dimension);
|
||||
for (int i = 0; i < dimension; i++) {
|
||||
|
@ -65,14 +67,14 @@ public final class Decoder {
|
|||
*
|
||||
* @param bits booleans representing white/black PDF417 Code modules
|
||||
* @return text and bytes encoded within the PDF417 Code
|
||||
* @throws ReaderException if the PDF417 Code cannot be decoded
|
||||
* @throws FormatException if the PDF417 Code cannot be decoded
|
||||
*/
|
||||
public DecoderResult decode(BitMatrix bits) throws ReaderException {
|
||||
public DecoderResult decode(BitMatrix bits) throws FormatException {
|
||||
// Construct a parser to read the data codewords and error-correction level
|
||||
BitMatrixParser parser = new BitMatrixParser(bits);
|
||||
int[] codewords = parser.readCodewords();
|
||||
if (codewords == null || codewords.length == 0) {
|
||||
throw ReaderException.getInstance();
|
||||
throw FormatException.getFormatInstance();
|
||||
}
|
||||
|
||||
int ecLevel = parser.getECLevel();
|
||||
|
@ -91,27 +93,27 @@ public final class Decoder {
|
|||
*
|
||||
* @param codewords
|
||||
* @return an index to the first data codeword.
|
||||
* @throws ReaderException
|
||||
* @throws FormatException
|
||||
*/
|
||||
private static void verifyCodewordCount(int[] codewords, int numECCodewords) throws ReaderException {
|
||||
private static void verifyCodewordCount(int[] codewords, int numECCodewords) throws FormatException {
|
||||
if (codewords.length < 4) {
|
||||
// Codeword array size should be at least 4 allowing for
|
||||
// Count CW, At least one Data CW, Error Correction CW, Error Correction CW
|
||||
throw ReaderException.getInstance();
|
||||
throw FormatException.getFormatInstance();
|
||||
}
|
||||
// The first codeword, the Symbol Length Descriptor, shall always encode the total number of data
|
||||
// codewords in the symbol, including the Symbol Length Descriptor itself, data codewords and pad
|
||||
// codewords, but excluding the number of error correction codewords.
|
||||
int numberOfCodewords = codewords[0];
|
||||
if (numberOfCodewords > codewords.length) {
|
||||
throw ReaderException.getInstance();
|
||||
throw FormatException.getFormatInstance();
|
||||
}
|
||||
if (numberOfCodewords == 0) {
|
||||
// Reset to the length of the array - 8 (Allow for at least level 3 Error Correction (8 Error Codewords)
|
||||
if (numECCodewords < codewords.length) {
|
||||
codewords[0] = codewords.length - numECCodewords;
|
||||
} else {
|
||||
throw ReaderException.getInstance();
|
||||
throw FormatException.getFormatInstance();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -121,15 +123,16 @@ public final class Decoder {
|
|||
* correct the errors in-place using Reed-Solomon error correction.</p>
|
||||
*
|
||||
* @param codewords data and error correction codewords
|
||||
* @throws ReaderException if error correction fails
|
||||
* @throws ChecksumException if error correction fails
|
||||
*/
|
||||
private static int correctErrors(int[] codewords, int[] erasures, int numECCodewords) throws ReaderException {
|
||||
private static int correctErrors(int[] codewords, int[] erasures, int numECCodewords) throws FormatException {
|
||||
if ((erasures != null && erasures.length > numECCodewords / 2 + MAX_ERRORS) ||
|
||||
(numECCodewords < 0 || numECCodewords > MAX_EC_CODEWORDS)) {
|
||||
// Too many errors or EC Codewords is corrupted
|
||||
throw ReaderException.getInstance();
|
||||
throw FormatException.getFormatInstance();
|
||||
}
|
||||
// Try to correct the errors
|
||||
// TODO enable error correction
|
||||
int result = 0; // rsDecoder.correctErrors(codewords, numECCodewords);
|
||||
if (erasures != null) {
|
||||
int numErasures = erasures.length;
|
||||
|
@ -138,7 +141,7 @@ public final class Decoder {
|
|||
}
|
||||
if (numErasures > MAX_ERRORS) {
|
||||
// Still too many errors
|
||||
throw ReaderException.getInstance();
|
||||
throw FormatException.getFormatInstance();
|
||||
}
|
||||
}
|
||||
return result;
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
package com.google.zxing.pdf417.detector;
|
||||
|
||||
import com.google.zxing.BinaryBitmap;
|
||||
import com.google.zxing.ReaderException;
|
||||
import com.google.zxing.NotFoundException;
|
||||
import com.google.zxing.ResultPoint;
|
||||
import com.google.zxing.common.BitMatrix;
|
||||
import com.google.zxing.common.DetectorResult;
|
||||
|
@ -62,9 +62,9 @@ public final class Detector {
|
|||
* <p>Detects a PDF417 Code in an image, simply.</p>
|
||||
*
|
||||
* @return {@link DetectorResult} encapsulating results of detecting a PDF417 Code
|
||||
* @throws ReaderException if no QR Code can be found
|
||||
* @throws NotFoundException if no QR Code can be found
|
||||
*/
|
||||
public DetectorResult detect() throws ReaderException {
|
||||
public DetectorResult detect() throws NotFoundException {
|
||||
return detect(null);
|
||||
}
|
||||
|
||||
|
@ -73,9 +73,9 @@ public final class Detector {
|
|||
*
|
||||
* @param hints optional hints to detector
|
||||
* @return {@link DetectorResult} encapsulating results of detecting a PDF417 Code
|
||||
* @throws ReaderException if no PDF417 Code can be found
|
||||
* @throws NotFoundException if no PDF417 Code can be found
|
||||
*/
|
||||
public DetectorResult detect(Hashtable hints) throws ReaderException {
|
||||
public DetectorResult detect(Hashtable hints) throws NotFoundException {
|
||||
// Fetch the 1 bit matrix once up front.
|
||||
BitMatrix matrix = image.getBlackMatrix();
|
||||
|
||||
|
@ -91,26 +91,26 @@ public final class Detector {
|
|||
correctCodeWordVertices(vertices, false);
|
||||
}
|
||||
|
||||
if (vertices != null) {
|
||||
float moduleWidth = computeModuleWidth(vertices);
|
||||
if (moduleWidth < 1.0f) {
|
||||
throw ReaderException.getInstance();
|
||||
}
|
||||
|
||||
int dimension = computeDimension(vertices[4], vertices[6],
|
||||
vertices[5], vertices[7], moduleWidth);
|
||||
if (dimension < 1) {
|
||||
throw ReaderException.getInstance();
|
||||
}
|
||||
|
||||
// Deskew and sample image.
|
||||
BitMatrix bits = sampleGrid(matrix, vertices[4], vertices[5],
|
||||
vertices[6], vertices[7], dimension);
|
||||
return new DetectorResult(bits, new ResultPoint[]{vertices[4],
|
||||
vertices[5], vertices[6], vertices[7]});
|
||||
} else {
|
||||
throw ReaderException.getInstance();
|
||||
if (vertices == null) {
|
||||
throw NotFoundException.getNotFoundInstance();
|
||||
}
|
||||
|
||||
float moduleWidth = computeModuleWidth(vertices);
|
||||
if (moduleWidth < 1.0f) {
|
||||
throw NotFoundException.getNotFoundInstance();
|
||||
}
|
||||
|
||||
int dimension = computeDimension(vertices[4], vertices[6],
|
||||
vertices[5], vertices[7], moduleWidth);
|
||||
if (dimension < 1) {
|
||||
throw NotFoundException.getNotFoundInstance();
|
||||
}
|
||||
|
||||
// Deskew and sample image.
|
||||
BitMatrix bits = sampleGrid(matrix, vertices[4], vertices[5],
|
||||
vertices[6], vertices[7], dimension);
|
||||
return new DetectorResult(bits, new ResultPoint[]{vertices[4],
|
||||
vertices[5], vertices[6], vertices[7]});
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -374,7 +374,7 @@ public final class Detector {
|
|||
|
||||
private static BitMatrix sampleGrid(BitMatrix matrix, ResultPoint topLeft,
|
||||
ResultPoint bottomLeft, ResultPoint topRight, ResultPoint bottomRight, int dimension)
|
||||
throws ReaderException {
|
||||
throws NotFoundException {
|
||||
|
||||
// Note that unlike the QR Code sampler, we didn't find the center of modules, but the
|
||||
// very corners. So there is no 0.5f here; 0.0f is right.
|
||||
|
|
|
@ -17,13 +17,15 @@
|
|||
package com.google.zxing.qrcode;
|
||||
|
||||
import com.google.zxing.BarcodeFormat;
|
||||
import com.google.zxing.DecodeHintType;
|
||||
import com.google.zxing.Reader;
|
||||
import com.google.zxing.ReaderException;
|
||||
import com.google.zxing.Result;
|
||||
import com.google.zxing.ResultPoint;
|
||||
import com.google.zxing.ResultMetadataType;
|
||||
import com.google.zxing.BinaryBitmap;
|
||||
import com.google.zxing.ChecksumException;
|
||||
import com.google.zxing.DecodeHintType;
|
||||
import com.google.zxing.FormatException;
|
||||
import com.google.zxing.NotFoundException;
|
||||
import com.google.zxing.Reader;
|
||||
import com.google.zxing.Result;
|
||||
import com.google.zxing.ResultMetadataType;
|
||||
import com.google.zxing.ResultPoint;
|
||||
import com.google.zxing.common.BitMatrix;
|
||||
import com.google.zxing.common.DecoderResult;
|
||||
import com.google.zxing.common.DetectorResult;
|
||||
|
@ -51,14 +53,16 @@ public class QRCodeReader implements Reader {
|
|||
* Locates and decodes a QR code in an image.
|
||||
*
|
||||
* @return a String representing the content encoded by the QR code
|
||||
* @throws ReaderException if a QR code cannot be found, or cannot be decoded
|
||||
* @throws NotFoundException if a QR code cannot be found
|
||||
* @throws FormatException if a QR code cannot be decoded
|
||||
* @throws ChecksumException if error correction fails
|
||||
*/
|
||||
public Result decode(BinaryBitmap image) throws ReaderException {
|
||||
public Result decode(BinaryBitmap image) throws NotFoundException, ChecksumException, FormatException {
|
||||
return decode(image, null);
|
||||
}
|
||||
|
||||
public Result decode(BinaryBitmap image, Hashtable hints)
|
||||
throws ReaderException {
|
||||
throws NotFoundException, ChecksumException, FormatException {
|
||||
DecoderResult decoderResult;
|
||||
ResultPoint[] points;
|
||||
if (hints != null && hints.containsKey(DecodeHintType.PURE_BARCODE)) {
|
||||
|
@ -91,7 +95,7 @@ public class QRCodeReader implements Reader {
|
|||
* around it. This is a specialized method that works exceptionally fast in this special
|
||||
* case.
|
||||
*/
|
||||
private static BitMatrix extractPureBits(BitMatrix image) throws ReaderException {
|
||||
private static BitMatrix extractPureBits(BitMatrix image) throws NotFoundException {
|
||||
// Now need to determine module size in pixels
|
||||
|
||||
int height = image.getHeight();
|
||||
|
@ -104,7 +108,7 @@ public class QRCodeReader implements Reader {
|
|||
borderWidth++;
|
||||
}
|
||||
if (borderWidth == minDimension) {
|
||||
throw ReaderException.getInstance();
|
||||
throw NotFoundException.getNotFoundInstance();
|
||||
}
|
||||
|
||||
// And then keep tracking across the top-left black module to determine module size
|
||||
|
@ -113,7 +117,7 @@ public class QRCodeReader implements Reader {
|
|||
moduleEnd++;
|
||||
}
|
||||
if (moduleEnd == minDimension) {
|
||||
throw ReaderException.getInstance();
|
||||
throw NotFoundException.getNotFoundInstance();
|
||||
}
|
||||
|
||||
int moduleSize = moduleEnd - borderWidth;
|
||||
|
@ -124,13 +128,13 @@ public class QRCodeReader implements Reader {
|
|||
rowEndOfSymbol--;
|
||||
}
|
||||
if (rowEndOfSymbol < 0) {
|
||||
throw ReaderException.getInstance();
|
||||
throw NotFoundException.getNotFoundInstance();
|
||||
}
|
||||
rowEndOfSymbol++;
|
||||
|
||||
// Make sure width of barcode is a multiple of module size
|
||||
if ((rowEndOfSymbol - borderWidth) % moduleSize != 0) {
|
||||
throw ReaderException.getInstance();
|
||||
throw NotFoundException.getNotFoundInstance();
|
||||
}
|
||||
int dimension = (rowEndOfSymbol - borderWidth) / moduleSize;
|
||||
|
||||
|
@ -141,7 +145,7 @@ public class QRCodeReader implements Reader {
|
|||
|
||||
int sampleDimension = borderWidth + (dimension - 1) * moduleSize;
|
||||
if (sampleDimension >= width || sampleDimension >= height) {
|
||||
throw ReaderException.getInstance();
|
||||
throw NotFoundException.getNotFoundInstance();
|
||||
}
|
||||
|
||||
// Now just read off the bits
|
||||
|
|
|
@ -21,9 +21,9 @@ import com.google.zxing.EncodeHintType;
|
|||
import com.google.zxing.Writer;
|
||||
import com.google.zxing.WriterException;
|
||||
import com.google.zxing.common.ByteMatrix;
|
||||
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
|
||||
import com.google.zxing.qrcode.encoder.Encoder;
|
||||
import com.google.zxing.qrcode.encoder.QRCode;
|
||||
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
|
||||
|
||||
import java.util.Hashtable;
|
||||
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
|
||||
package com.google.zxing.qrcode.decoder;
|
||||
|
||||
import com.google.zxing.ReaderException;
|
||||
import com.google.zxing.FormatException;
|
||||
import com.google.zxing.common.BitMatrix;
|
||||
|
||||
/**
|
||||
|
@ -30,12 +30,12 @@ final class BitMatrixParser {
|
|||
|
||||
/**
|
||||
* @param bitMatrix {@link BitMatrix} to parse
|
||||
* @throws ReaderException if dimension is not >= 21 and 1 mod 4
|
||||
* @throws FormatException if dimension is not >= 21 and 1 mod 4
|
||||
*/
|
||||
BitMatrixParser(BitMatrix bitMatrix) throws ReaderException {
|
||||
BitMatrixParser(BitMatrix bitMatrix) throws FormatException {
|
||||
int dimension = bitMatrix.getDimension();
|
||||
if (dimension < 21 || (dimension & 0x03) != 1) {
|
||||
throw ReaderException.getInstance();
|
||||
throw FormatException.getFormatInstance();
|
||||
}
|
||||
this.bitMatrix = bitMatrix;
|
||||
}
|
||||
|
@ -44,10 +44,10 @@ final class BitMatrixParser {
|
|||
* <p>Reads format information from one of its two locations within the QR Code.</p>
|
||||
*
|
||||
* @return {@link FormatInformation} encapsulating the QR Code's format info
|
||||
* @throws ReaderException if both format information locations cannot be parsed as
|
||||
* @throws FormatException if both format information locations cannot be parsed as
|
||||
* the valid encoding of format information
|
||||
*/
|
||||
FormatInformation readFormatInformation() throws ReaderException {
|
||||
FormatInformation readFormatInformation() throws FormatException {
|
||||
|
||||
if (parsedFormatInfo != null) {
|
||||
return parsedFormatInfo;
|
||||
|
@ -87,17 +87,17 @@ final class BitMatrixParser {
|
|||
if (parsedFormatInfo != null) {
|
||||
return parsedFormatInfo;
|
||||
}
|
||||
throw ReaderException.getInstance();
|
||||
throw FormatException.getFormatInstance();
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>Reads version information from one of its two locations within the QR Code.</p>
|
||||
*
|
||||
* @return {@link Version} encapsulating the QR Code's version
|
||||
* @throws ReaderException if both version information locations cannot be parsed as
|
||||
* @throws FormatException if both version information locations cannot be parsed as
|
||||
* the valid encoding of version information
|
||||
*/
|
||||
Version readVersion() throws ReaderException {
|
||||
Version readVersion() throws FormatException {
|
||||
|
||||
if (parsedVersion != null) {
|
||||
return parsedVersion;
|
||||
|
@ -136,7 +136,7 @@ final class BitMatrixParser {
|
|||
if (parsedVersion != null && parsedVersion.getDimensionForVersion() == dimension) {
|
||||
return parsedVersion;
|
||||
}
|
||||
throw ReaderException.getInstance();
|
||||
throw FormatException.getFormatInstance();
|
||||
}
|
||||
|
||||
private int copyBit(int i, int j, int versionBits) {
|
||||
|
@ -149,9 +149,9 @@ final class BitMatrixParser {
|
|||
* QR Code.</p>
|
||||
*
|
||||
* @return bytes encoded within the QR Code
|
||||
* @throws ReaderException if the exact number of bytes expected is not read
|
||||
* @throws FormatException if the exact number of bytes expected is not read
|
||||
*/
|
||||
byte[] readCodewords() throws ReaderException {
|
||||
byte[] readCodewords() throws FormatException {
|
||||
|
||||
FormatInformation formatInfo = readFormatInformation();
|
||||
Version version = readVersion();
|
||||
|
@ -200,7 +200,7 @@ final class BitMatrixParser {
|
|||
readingUp ^= true; // readingUp = !readingUp; // switch directions
|
||||
}
|
||||
if (resultOffset != version.getTotalCodewords()) {
|
||||
throw ReaderException.getInstance();
|
||||
throw FormatException.getFormatInstance();
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
package com.google.zxing.qrcode.decoder;
|
||||
|
||||
import com.google.zxing.DecodeHintType;
|
||||
import com.google.zxing.ReaderException;
|
||||
import com.google.zxing.FormatException;
|
||||
import com.google.zxing.common.BitSource;
|
||||
import com.google.zxing.common.CharacterSetECI;
|
||||
import com.google.zxing.common.DecoderResult;
|
||||
|
@ -60,7 +60,7 @@ final class DecodedBitStreamParser {
|
|||
}
|
||||
|
||||
static DecoderResult decode(byte[] bytes, Version version, ErrorCorrectionLevel ecLevel, Hashtable hints)
|
||||
throws ReaderException {
|
||||
throws FormatException {
|
||||
BitSource bits = new BitSource(bytes);
|
||||
StringBuffer result = new StringBuffer(50);
|
||||
CharacterSetECI currentCharacterSetECI = null;
|
||||
|
@ -76,7 +76,7 @@ final class DecodedBitStreamParser {
|
|||
try {
|
||||
mode = Mode.forBits(bits.readBits(4)); // mode is encoded by 4 bits
|
||||
} catch (IllegalArgumentException iae) {
|
||||
throw ReaderException.getInstance();
|
||||
throw FormatException.getFormatInstance();
|
||||
}
|
||||
}
|
||||
if (!mode.equals(Mode.TERMINATOR)) {
|
||||
|
@ -92,7 +92,7 @@ final class DecodedBitStreamParser {
|
|||
int value = parseECIValue(bits);
|
||||
currentCharacterSetECI = CharacterSetECI.getCharacterSetECIByValue(value);
|
||||
if (currentCharacterSetECI == null) {
|
||||
throw ReaderException.getInstance();
|
||||
throw FormatException.getFormatInstance();
|
||||
}
|
||||
} else {
|
||||
// How many characters will follow, encoded in this mode?
|
||||
|
@ -106,7 +106,7 @@ final class DecodedBitStreamParser {
|
|||
} else if (mode.equals(Mode.KANJI)) {
|
||||
decodeKanjiSegment(bits, result, count);
|
||||
} else {
|
||||
throw ReaderException.getInstance();
|
||||
throw FormatException.getFormatInstance();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -117,7 +117,7 @@ final class DecodedBitStreamParser {
|
|||
|
||||
private static void decodeKanjiSegment(BitSource bits,
|
||||
StringBuffer result,
|
||||
int count) throws ReaderException {
|
||||
int count) throws FormatException {
|
||||
// Each character will require 2 bytes. Read the characters as 2-byte pairs
|
||||
// and decode as Shift_JIS afterwards
|
||||
byte[] buffer = new byte[2 * count];
|
||||
|
@ -142,7 +142,7 @@ final class DecodedBitStreamParser {
|
|||
try {
|
||||
result.append(new String(buffer, SHIFT_JIS));
|
||||
} catch (UnsupportedEncodingException uee) {
|
||||
throw ReaderException.getInstance();
|
||||
throw FormatException.getFormatInstance();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -151,10 +151,10 @@ final class DecodedBitStreamParser {
|
|||
int count,
|
||||
CharacterSetECI currentCharacterSetECI,
|
||||
Vector byteSegments,
|
||||
Hashtable hints) throws ReaderException {
|
||||
Hashtable hints) throws FormatException {
|
||||
byte[] readBytes = new byte[count];
|
||||
if (count << 3 > bits.available()) {
|
||||
throw ReaderException.getInstance();
|
||||
throw FormatException.getFormatInstance();
|
||||
}
|
||||
for (int i = 0; i < count; i++) {
|
||||
readBytes[i] = (byte) bits.readBits(8);
|
||||
|
@ -173,7 +173,7 @@ final class DecodedBitStreamParser {
|
|||
try {
|
||||
result.append(new String(readBytes, encoding));
|
||||
} catch (UnsupportedEncodingException uce) {
|
||||
throw ReaderException.getInstance();
|
||||
throw FormatException.getFormatInstance();
|
||||
}
|
||||
byteSegments.addElement(readBytes);
|
||||
}
|
||||
|
@ -213,13 +213,13 @@ final class DecodedBitStreamParser {
|
|||
|
||||
private static void decodeNumericSegment(BitSource bits,
|
||||
StringBuffer result,
|
||||
int count) throws ReaderException {
|
||||
int count) throws FormatException {
|
||||
// Read three digits at a time
|
||||
while (count >= 3) {
|
||||
// Each 10 bits encodes three digits
|
||||
int threeDigitsBits = bits.readBits(10);
|
||||
if (threeDigitsBits >= 1000) {
|
||||
throw ReaderException.getInstance();
|
||||
throw FormatException.getFormatInstance();
|
||||
}
|
||||
result.append(ALPHANUMERIC_CHARS[threeDigitsBits / 100]);
|
||||
result.append(ALPHANUMERIC_CHARS[(threeDigitsBits / 10) % 10]);
|
||||
|
@ -230,7 +230,7 @@ final class DecodedBitStreamParser {
|
|||
// Two digits left over to read, encoded in 7 bits
|
||||
int twoDigitsBits = bits.readBits(7);
|
||||
if (twoDigitsBits >= 100) {
|
||||
throw ReaderException.getInstance();
|
||||
throw FormatException.getFormatInstance();
|
||||
}
|
||||
result.append(ALPHANUMERIC_CHARS[twoDigitsBits / 10]);
|
||||
result.append(ALPHANUMERIC_CHARS[twoDigitsBits % 10]);
|
||||
|
@ -238,7 +238,7 @@ final class DecodedBitStreamParser {
|
|||
// One digit left over to read
|
||||
int digitBits = bits.readBits(4);
|
||||
if (digitBits >= 10) {
|
||||
throw ReaderException.getInstance();
|
||||
throw FormatException.getFormatInstance();
|
||||
}
|
||||
result.append(ALPHANUMERIC_CHARS[digitBits]);
|
||||
}
|
||||
|
|
|
@ -16,7 +16,9 @@
|
|||
|
||||
package com.google.zxing.qrcode.decoder;
|
||||
|
||||
import com.google.zxing.ReaderException;
|
||||
import com.google.zxing.ChecksumException;
|
||||
import com.google.zxing.FormatException;
|
||||
import com.google.zxing.NotFoundException;
|
||||
import com.google.zxing.common.BitMatrix;
|
||||
import com.google.zxing.common.DecoderResult;
|
||||
import com.google.zxing.common.reedsolomon.GF256;
|
||||
|
@ -39,7 +41,8 @@ public final class Decoder {
|
|||
rsDecoder = new ReedSolomonDecoder(GF256.QR_CODE_FIELD);
|
||||
}
|
||||
|
||||
public DecoderResult decode(boolean[][] image) throws ReaderException {
|
||||
public DecoderResult decode(boolean[][] image)
|
||||
throws ChecksumException, FormatException, NotFoundException {
|
||||
return decode(image, null);
|
||||
}
|
||||
|
||||
|
@ -49,9 +52,12 @@ public final class Decoder {
|
|||
*
|
||||
* @param image booleans representing white/black QR Code modules
|
||||
* @return text and bytes encoded within the QR Code
|
||||
* @throws ReaderException if the QR Code cannot be decoded
|
||||
* @throws NotFoundException if the QR Code cannot be found
|
||||
* @throws FormatException if the QR Code cannot be decoded
|
||||
* @throws ChecksumException if error correction fails
|
||||
*/
|
||||
public DecoderResult decode(boolean[][] image, Hashtable hints) throws ReaderException {
|
||||
public DecoderResult decode(boolean[][] image, Hashtable hints)
|
||||
throws ChecksumException, FormatException, NotFoundException {
|
||||
int dimension = image.length;
|
||||
BitMatrix bits = new BitMatrix(dimension);
|
||||
for (int i = 0; i < dimension; i++) {
|
||||
|
@ -64,7 +70,7 @@ public final class Decoder {
|
|||
return decode(bits, hints);
|
||||
}
|
||||
|
||||
public DecoderResult decode(BitMatrix bits) throws ReaderException {
|
||||
public DecoderResult decode(BitMatrix bits) throws ChecksumException, FormatException, NotFoundException {
|
||||
return decode(bits, null);
|
||||
}
|
||||
|
||||
|
@ -73,9 +79,12 @@ public final class Decoder {
|
|||
*
|
||||
* @param bits booleans representing white/black QR Code modules
|
||||
* @return text and bytes encoded within the QR Code
|
||||
* @throws ReaderException if the QR Code cannot be decoded
|
||||
* @throws NotFoundException if the QR Code cannot be found
|
||||
* @throws FormatException if the QR Code cannot be decoded
|
||||
* @throws ChecksumException if error correction fails
|
||||
*/
|
||||
public DecoderResult decode(BitMatrix bits, Hashtable hints) throws ReaderException {
|
||||
public DecoderResult decode(BitMatrix bits, Hashtable hints)
|
||||
throws NotFoundException, FormatException, ChecksumException {
|
||||
|
||||
// Construct a parser and read version, error-correction level
|
||||
BitMatrixParser parser = new BitMatrixParser(bits);
|
||||
|
@ -116,9 +125,9 @@ public final class Decoder {
|
|||
*
|
||||
* @param codewordBytes data and error correction codewords
|
||||
* @param numDataCodewords number of codewords that are data bytes
|
||||
* @throws ReaderException if error correction fails
|
||||
* @throws ChecksumException if error correction fails
|
||||
*/
|
||||
private void correctErrors(byte[] codewordBytes, int numDataCodewords) throws ReaderException {
|
||||
private void correctErrors(byte[] codewordBytes, int numDataCodewords) throws ChecksumException {
|
||||
int numCodewords = codewordBytes.length;
|
||||
// First read into an array of ints
|
||||
int[] codewordsInts = new int[numCodewords];
|
||||
|
@ -129,7 +138,7 @@ public final class Decoder {
|
|||
try {
|
||||
rsDecoder.decode(codewordsInts, numECCodewords);
|
||||
} catch (ReedSolomonException rse) {
|
||||
throw ReaderException.getInstance();
|
||||
throw ChecksumException.getChecksumInstance();
|
||||
}
|
||||
// Copy back into array of bytes -- only need to worry about the bytes that were data
|
||||
// We don't care about errors in the error-correction codewords
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
|
||||
package com.google.zxing.qrcode.decoder;
|
||||
|
||||
import com.google.zxing.ReaderException;
|
||||
import com.google.zxing.FormatException;
|
||||
import com.google.zxing.common.BitMatrix;
|
||||
|
||||
/**
|
||||
|
@ -91,16 +91,16 @@ public final class Version {
|
|||
*
|
||||
* @param dimension dimension in modules
|
||||
* @return {@link Version} for a QR Code of that dimension
|
||||
* @throws ReaderException if dimension is not 1 mod 4
|
||||
* @throws FormatException if dimension is not 1 mod 4
|
||||
*/
|
||||
public static Version getProvisionalVersionForDimension(int dimension) throws ReaderException {
|
||||
public static Version getProvisionalVersionForDimension(int dimension) throws FormatException {
|
||||
if (dimension % 4 != 1) {
|
||||
throw ReaderException.getInstance();
|
||||
throw FormatException.getFormatInstance();
|
||||
}
|
||||
try {
|
||||
return getVersionForNumber((dimension - 17) >> 2);
|
||||
} catch (IllegalArgumentException iae) {
|
||||
throw ReaderException.getInstance();
|
||||
throw FormatException.getFormatInstance();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
|
||||
package com.google.zxing.qrcode.detector;
|
||||
|
||||
import com.google.zxing.ReaderException;
|
||||
import com.google.zxing.NotFoundException;
|
||||
import com.google.zxing.ResultPoint;
|
||||
import com.google.zxing.ResultPointCallback;
|
||||
import com.google.zxing.common.BitMatrix;
|
||||
|
@ -82,9 +82,9 @@ final class AlignmentPatternFinder {
|
|||
* it's pretty performance-critical and so is written to be fast foremost.</p>
|
||||
*
|
||||
* @return {@link AlignmentPattern} if found
|
||||
* @throws ReaderException if not found
|
||||
* @throws NotFoundException if not found
|
||||
*/
|
||||
AlignmentPattern find() throws ReaderException {
|
||||
AlignmentPattern find() throws NotFoundException {
|
||||
int startX = this.startX;
|
||||
int height = this.height;
|
||||
int maxJ = startX + width;
|
||||
|
@ -150,7 +150,7 @@ final class AlignmentPatternFinder {
|
|||
return (AlignmentPattern) possibleCenters.elementAt(0);
|
||||
}
|
||||
|
||||
throw ReaderException.getInstance();
|
||||
throw NotFoundException.getNotFoundInstance();
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -17,7 +17,8 @@
|
|||
package com.google.zxing.qrcode.detector;
|
||||
|
||||
import com.google.zxing.DecodeHintType;
|
||||
import com.google.zxing.ReaderException;
|
||||
import com.google.zxing.FormatException;
|
||||
import com.google.zxing.NotFoundException;
|
||||
import com.google.zxing.ResultPoint;
|
||||
import com.google.zxing.ResultPointCallback;
|
||||
import com.google.zxing.common.BitMatrix;
|
||||
|
@ -55,9 +56,9 @@ public class Detector {
|
|||
* <p>Detects a QR Code in an image, simply.</p>
|
||||
*
|
||||
* @return {@link DetectorResult} encapsulating results of detecting a QR Code
|
||||
* @throws ReaderException if no QR Code can be found
|
||||
* @throws NotFoundException if no QR Code can be found
|
||||
*/
|
||||
public DetectorResult detect() throws ReaderException {
|
||||
public DetectorResult detect() throws NotFoundException, FormatException {
|
||||
return detect(null);
|
||||
}
|
||||
|
||||
|
@ -65,10 +66,11 @@ public class Detector {
|
|||
* <p>Detects a QR Code in an image, simply.</p>
|
||||
*
|
||||
* @param hints optional hints to detector
|
||||
* @return {@link DetectorResult} encapsulating results of detecting a QR Code
|
||||
* @throws ReaderException if no QR Code can be found
|
||||
* @return {@link NotFoundException} encapsulating results of detecting a QR Code
|
||||
* @throws NotFoundException if QR Code cannot be found
|
||||
* @throws FormatException if a QR Code cannot be decoded
|
||||
*/
|
||||
public DetectorResult detect(Hashtable hints) throws ReaderException {
|
||||
public DetectorResult detect(Hashtable hints) throws NotFoundException, FormatException {
|
||||
|
||||
resultPointCallback = hints == null ? null :
|
||||
(ResultPointCallback) hints.get(DecodeHintType.NEED_RESULT_POINT_CALLBACK);
|
||||
|
@ -79,7 +81,8 @@ public class Detector {
|
|||
return processFinderPatternInfo(info);
|
||||
}
|
||||
|
||||
protected DetectorResult processFinderPatternInfo(FinderPatternInfo info) throws ReaderException {
|
||||
protected DetectorResult processFinderPatternInfo(FinderPatternInfo info)
|
||||
throws NotFoundException, FormatException {
|
||||
|
||||
FinderPattern topLeft = info.getTopLeft();
|
||||
FinderPattern topRight = info.getTopRight();
|
||||
|
@ -87,7 +90,7 @@ public class Detector {
|
|||
|
||||
float moduleSize = calculateModuleSize(topLeft, topRight, bottomLeft);
|
||||
if (moduleSize < 1.0f) {
|
||||
throw ReaderException.getInstance();
|
||||
throw NotFoundException.getNotFoundInstance();
|
||||
}
|
||||
int dimension = computeDimension(topLeft, topRight, bottomLeft, moduleSize);
|
||||
Version provisionalVersion = Version.getProvisionalVersionForDimension(dimension);
|
||||
|
@ -115,7 +118,7 @@ public class Detector {
|
|||
estAlignmentY,
|
||||
(float) i);
|
||||
break;
|
||||
} catch (ReaderException re) {
|
||||
} catch (NotFoundException re) {
|
||||
// try next round
|
||||
}
|
||||
}
|
||||
|
@ -180,7 +183,7 @@ public class Detector {
|
|||
|
||||
private static BitMatrix sampleGrid(BitMatrix image,
|
||||
PerspectiveTransform transform,
|
||||
int dimension) throws ReaderException {
|
||||
int dimension) throws NotFoundException {
|
||||
|
||||
GridSampler sampler = GridSampler.getInstance();
|
||||
return sampler.sampleGrid(image, dimension, transform);
|
||||
|
@ -193,7 +196,7 @@ public class Detector {
|
|||
protected static int computeDimension(ResultPoint topLeft,
|
||||
ResultPoint topRight,
|
||||
ResultPoint bottomLeft,
|
||||
float moduleSize) throws ReaderException {
|
||||
float moduleSize) throws NotFoundException {
|
||||
int tltrCentersDimension = round(ResultPoint.distance(topLeft, topRight) / moduleSize);
|
||||
int tlblCentersDimension = round(ResultPoint.distance(topLeft, bottomLeft) / moduleSize);
|
||||
int dimension = ((tltrCentersDimension + tlblCentersDimension) >> 1) + 7;
|
||||
|
@ -206,7 +209,7 @@ public class Detector {
|
|||
dimension--;
|
||||
break;
|
||||
case 3:
|
||||
throw ReaderException.getInstance();
|
||||
throw NotFoundException.getNotFoundInstance();
|
||||
}
|
||||
return dimension;
|
||||
}
|
||||
|
@ -352,20 +355,20 @@ public class Detector {
|
|||
* @param estAlignmentY y coordinate of above
|
||||
* @param allowanceFactor number of pixels in all directions to search from the center
|
||||
* @return {@link AlignmentPattern} if found, or null otherwise
|
||||
* @throws ReaderException if an unexpected error occurs during detection
|
||||
* @throws NotFoundException if an unexpected error occurs during detection
|
||||
*/
|
||||
protected AlignmentPattern findAlignmentInRegion(float overallEstModuleSize,
|
||||
int estAlignmentX,
|
||||
int estAlignmentY,
|
||||
float allowanceFactor)
|
||||
throws ReaderException {
|
||||
throws NotFoundException {
|
||||
// Look for an alignment pattern (3 modules in size) around where it
|
||||
// should be
|
||||
int allowance = (int) (allowanceFactor * overallEstModuleSize);
|
||||
int alignmentAreaLeftX = Math.max(0, estAlignmentX - allowance);
|
||||
int alignmentAreaRightX = Math.min(image.getWidth() - 1, estAlignmentX + allowance);
|
||||
if (alignmentAreaRightX - alignmentAreaLeftX < overallEstModuleSize * 3) {
|
||||
throw ReaderException.getInstance();
|
||||
throw NotFoundException.getNotFoundInstance();
|
||||
}
|
||||
|
||||
int alignmentAreaTopY = Math.max(0, estAlignmentY - allowance);
|
||||
|
|
|
@ -17,12 +17,12 @@
|
|||
package com.google.zxing.qrcode.detector;
|
||||
|
||||
import com.google.zxing.DecodeHintType;
|
||||
import com.google.zxing.ReaderException;
|
||||
import com.google.zxing.NotFoundException;
|
||||
import com.google.zxing.ResultPoint;
|
||||
import com.google.zxing.ResultPointCallback;
|
||||
import com.google.zxing.common.BitMatrix;
|
||||
import com.google.zxing.common.Collections;
|
||||
import com.google.zxing.common.Comparator;
|
||||
import com.google.zxing.common.BitMatrix;
|
||||
|
||||
import java.util.Hashtable;
|
||||
import java.util.Vector;
|
||||
|
@ -72,7 +72,7 @@ public class FinderPatternFinder {
|
|||
return possibleCenters;
|
||||
}
|
||||
|
||||
FinderPatternInfo find(Hashtable hints) throws ReaderException {
|
||||
FinderPatternInfo find(Hashtable hints) throws NotFoundException {
|
||||
boolean tryHarder = hints != null && hints.containsKey(DecodeHintType.TRY_HARDER);
|
||||
int maxI = image.getHeight();
|
||||
int maxJ = image.getWidth();
|
||||
|
@ -488,14 +488,14 @@ public class FinderPatternFinder {
|
|||
* @return the 3 best {@link FinderPattern}s from our list of candidates. The "best" are
|
||||
* those that have been detected at least {@link #CENTER_QUORUM} times, and whose module
|
||||
* size differs from the average among those patterns the least
|
||||
* @throws ReaderException if 3 such finder patterns do not exist
|
||||
* @throws NotFoundException if 3 such finder patterns do not exist
|
||||
*/
|
||||
private FinderPattern[] selectBestPatterns() throws ReaderException {
|
||||
private FinderPattern[] selectBestPatterns() throws NotFoundException {
|
||||
|
||||
int startSize = possibleCenters.size();
|
||||
if (startSize < 3) {
|
||||
// Couldn't find enough finder patterns
|
||||
throw ReaderException.getInstance();
|
||||
throw NotFoundException.getNotFoundInstance();
|
||||
}
|
||||
|
||||
// Filter outlier possibilities whose module size is too different
|
||||
|
|
|
@ -16,8 +16,8 @@
|
|||
|
||||
package com.google.zxing.qrcode.encoder;
|
||||
|
||||
import com.google.zxing.WriterException;
|
||||
import com.google.zxing.EncodeHintType;
|
||||
import com.google.zxing.WriterException;
|
||||
import com.google.zxing.common.ByteArray;
|
||||
import com.google.zxing.common.ByteMatrix;
|
||||
import com.google.zxing.common.CharacterSetECI;
|
||||
|
@ -27,9 +27,9 @@ import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
|
|||
import com.google.zxing.qrcode.decoder.Mode;
|
||||
import com.google.zxing.qrcode.decoder.Version;
|
||||
|
||||
import java.util.Vector;
|
||||
import java.util.Hashtable;
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.util.Hashtable;
|
||||
import java.util.Vector;
|
||||
|
||||
/**
|
||||
* @author satorux@google.com (Satoru Takabayashi) - creator
|
||||
|
|
|
@ -16,9 +16,9 @@
|
|||
|
||||
package com.google.zxing.client.result;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
import com.google.zxing.Result;
|
||||
import com.google.zxing.BarcodeFormat;
|
||||
import com.google.zxing.Result;
|
||||
import junit.framework.TestCase;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
|
|
|
@ -16,9 +16,9 @@
|
|||
|
||||
package com.google.zxing.client.result;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
import com.google.zxing.Result;
|
||||
import com.google.zxing.BarcodeFormat;
|
||||
import com.google.zxing.Result;
|
||||
import junit.framework.TestCase;
|
||||
|
||||
/**
|
||||
* Tests {@link CalendarParsedResult}.
|
||||
|
|
|
@ -16,9 +16,9 @@
|
|||
|
||||
package com.google.zxing.client.result;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
import com.google.zxing.Result;
|
||||
import com.google.zxing.BarcodeFormat;
|
||||
import com.google.zxing.Result;
|
||||
import junit.framework.TestCase;
|
||||
|
||||
/**
|
||||
* Tests {@link EmailAddressParsedResult}.
|
||||
|
|
|
@ -16,9 +16,9 @@
|
|||
|
||||
package com.google.zxing.client.result;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
import com.google.zxing.Result;
|
||||
import com.google.zxing.BarcodeFormat;
|
||||
import com.google.zxing.Result;
|
||||
import junit.framework.TestCase;
|
||||
|
||||
/**
|
||||
* Tests {@link com.google.zxing.client.result.GeoParsedResult}.
|
||||
|
|
|
@ -16,9 +16,9 @@
|
|||
|
||||
package com.google.zxing.client.result;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
import com.google.zxing.Result;
|
||||
import com.google.zxing.BarcodeFormat;
|
||||
import com.google.zxing.Result;
|
||||
import junit.framework.TestCase;
|
||||
|
||||
/**
|
||||
* Tests {@link ISBNParsedResult}.
|
||||
|
|
|
@ -16,9 +16,9 @@
|
|||
|
||||
package com.google.zxing.client.result;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
import com.google.zxing.Result;
|
||||
import com.google.zxing.BarcodeFormat;
|
||||
import com.google.zxing.Result;
|
||||
import junit.framework.TestCase;
|
||||
|
||||
/**
|
||||
* Tests {@link ProductParsedResult}.
|
||||
|
|
|
@ -16,9 +16,9 @@
|
|||
|
||||
package com.google.zxing.client.result;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
import com.google.zxing.Result;
|
||||
import com.google.zxing.BarcodeFormat;
|
||||
import com.google.zxing.Result;
|
||||
import junit.framework.TestCase;
|
||||
|
||||
/**
|
||||
* Tests {@link SMSParsedResult}.
|
||||
|
|
|
@ -16,9 +16,9 @@
|
|||
|
||||
package com.google.zxing.client.result;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
import com.google.zxing.Result;
|
||||
import com.google.zxing.BarcodeFormat;
|
||||
import com.google.zxing.Result;
|
||||
import junit.framework.TestCase;
|
||||
|
||||
/**
|
||||
* Tests {@link TelParsedResult}.
|
||||
|
|
|
@ -16,9 +16,9 @@
|
|||
|
||||
package com.google.zxing.client.result;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
import com.google.zxing.Result;
|
||||
import com.google.zxing.BarcodeFormat;
|
||||
import com.google.zxing.Result;
|
||||
import junit.framework.TestCase;
|
||||
|
||||
/**
|
||||
* Tests {@link URIParsedResult}.
|
||||
|
|
|
@ -24,9 +24,9 @@ import com.google.zxing.Reader;
|
|||
import com.google.zxing.ReaderException;
|
||||
import com.google.zxing.Result;
|
||||
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
|
||||
import javax.imageio.ImageIO;
|
||||
import java.awt.geom.AffineTransform;
|
||||
import java.awt.image.AffineTransformOp;
|
||||
import java.awt.image.BufferedImage;
|
||||
|
@ -41,8 +41,6 @@ import java.util.ArrayList;
|
|||
import java.util.Hashtable;
|
||||
import java.util.List;
|
||||
|
||||
import javax.imageio.ImageIO;
|
||||
|
||||
/**
|
||||
* @author Sean Owen
|
||||
* @author dswitkin@google.com (Daniel Switkin)
|
||||
|
|
|
@ -23,14 +23,13 @@ import com.google.zxing.ReaderException;
|
|||
import com.google.zxing.Result;
|
||||
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
|
||||
|
||||
import javax.imageio.ImageIO;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import javax.imageio.ImageIO;
|
||||
|
||||
/**
|
||||
* This abstract class looks for negative results, i.e. it only allows a certain number of false
|
||||
* positives in images which should not decode. This helps ensure that we are not too lenient.
|
||||
|
|
|
@ -18,14 +18,12 @@ package com.google.zxing.datamatrix.decoder;
|
|||
|
||||
import junit.framework.TestCase;
|
||||
|
||||
import com.google.zxing.ReaderException;
|
||||
|
||||
/**
|
||||
* @author bbrown@google.com (Brian Brown)
|
||||
*/
|
||||
public final class DecodedBitStreamParserTestCase extends TestCase{
|
||||
|
||||
public void testAsciiStandardDecode() throws ReaderException {
|
||||
public void testAsciiStandardDecode() throws Exception {
|
||||
// ASCII characters 0-127 are encoded as the value + 1
|
||||
byte[] bytes = {(byte) ('a' + 1), (byte) ('b' + 1), (byte) ('c' + 1),
|
||||
(byte) ('A' + 1), (byte) ('B' + 1), (byte) ('C' + 1)};
|
||||
|
@ -33,7 +31,7 @@ public final class DecodedBitStreamParserTestCase extends TestCase{
|
|||
assertEquals("abcABC", decodedString);
|
||||
}
|
||||
|
||||
public void testAsciiDoubleDigitDecode() throws ReaderException{
|
||||
public void testAsciiDoubleDigitDecode() throws Exception{
|
||||
// ASCII double digit (00 - 99) Numeric Value + 130
|
||||
byte[] bytes = {(byte) 130 , (byte) ( 1 + 130),
|
||||
(byte) (98 + 130), (byte) (99 + 130)};
|
||||
|
|
|
@ -16,8 +16,8 @@
|
|||
|
||||
package com.google.zxing.oned;
|
||||
|
||||
import com.google.zxing.MultiFormatReader;
|
||||
import com.google.zxing.BarcodeFormat;
|
||||
import com.google.zxing.MultiFormatReader;
|
||||
import com.google.zxing.common.AbstractBlackBoxTestCase;
|
||||
|
||||
/**
|
||||
|
|
|
@ -16,8 +16,8 @@
|
|||
|
||||
package com.google.zxing.oned;
|
||||
|
||||
import com.google.zxing.MultiFormatReader;
|
||||
import com.google.zxing.BarcodeFormat;
|
||||
import com.google.zxing.MultiFormatReader;
|
||||
import com.google.zxing.common.AbstractBlackBoxTestCase;
|
||||
|
||||
/**
|
||||
|
|
|
@ -16,8 +16,8 @@
|
|||
|
||||
package com.google.zxing.oned;
|
||||
|
||||
import com.google.zxing.common.AbstractBlackBoxTestCase;
|
||||
import com.google.zxing.BarcodeFormat;
|
||||
import com.google.zxing.common.AbstractBlackBoxTestCase;
|
||||
|
||||
/**
|
||||
* @author Sean Owen
|
||||
|
|
|
@ -16,8 +16,8 @@
|
|||
|
||||
package com.google.zxing.oned;
|
||||
|
||||
import com.google.zxing.MultiFormatReader;
|
||||
import com.google.zxing.BarcodeFormat;
|
||||
import com.google.zxing.MultiFormatReader;
|
||||
import com.google.zxing.common.AbstractBlackBoxTestCase;
|
||||
|
||||
/**
|
||||
|
|
|
@ -16,8 +16,8 @@
|
|||
|
||||
package com.google.zxing.oned;
|
||||
|
||||
import com.google.zxing.MultiFormatReader;
|
||||
import com.google.zxing.BarcodeFormat;
|
||||
import com.google.zxing.MultiFormatReader;
|
||||
import com.google.zxing.common.AbstractBlackBoxTestCase;
|
||||
|
||||
/**
|
||||
|
|
|
@ -16,12 +16,10 @@
|
|||
|
||||
package com.google.zxing.oned;
|
||||
|
||||
import com.google.zxing.MultiFormatReader;
|
||||
import com.google.zxing.BarcodeFormat;
|
||||
import com.google.zxing.MultiFormatReader;
|
||||
import com.google.zxing.common.AbstractBlackBoxTestCase;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
/**
|
||||
* @author dswitkin@google.com (Daniel Switkin)
|
||||
*/
|
||||
|
|
|
@ -16,8 +16,8 @@
|
|||
|
||||
package com.google.zxing.oned;
|
||||
|
||||
import com.google.zxing.MultiFormatReader;
|
||||
import com.google.zxing.BarcodeFormat;
|
||||
import com.google.zxing.MultiFormatReader;
|
||||
import com.google.zxing.common.AbstractBlackBoxTestCase;
|
||||
|
||||
/**
|
||||
|
|
|
@ -16,8 +16,8 @@
|
|||
|
||||
package com.google.zxing.oned;
|
||||
|
||||
import com.google.zxing.MultiFormatReader;
|
||||
import com.google.zxing.BarcodeFormat;
|
||||
import com.google.zxing.MultiFormatReader;
|
||||
import com.google.zxing.common.AbstractBlackBoxTestCase;
|
||||
|
||||
/**
|
||||
|
|
|
@ -16,8 +16,8 @@
|
|||
|
||||
package com.google.zxing.oned;
|
||||
|
||||
import com.google.zxing.MultiFormatReader;
|
||||
import com.google.zxing.BarcodeFormat;
|
||||
import com.google.zxing.MultiFormatReader;
|
||||
import com.google.zxing.common.AbstractBlackBoxTestCase;
|
||||
|
||||
/**
|
||||
|
|
|
@ -16,8 +16,8 @@
|
|||
|
||||
package com.google.zxing.oned;
|
||||
|
||||
import com.google.zxing.MultiFormatReader;
|
||||
import com.google.zxing.BarcodeFormat;
|
||||
import com.google.zxing.MultiFormatReader;
|
||||
import com.google.zxing.common.AbstractBlackBoxTestCase;
|
||||
|
||||
/**
|
||||
|
|
|
@ -16,8 +16,8 @@
|
|||
|
||||
package com.google.zxing.oned;
|
||||
|
||||
import com.google.zxing.MultiFormatReader;
|
||||
import com.google.zxing.BarcodeFormat;
|
||||
import com.google.zxing.MultiFormatReader;
|
||||
import com.google.zxing.common.AbstractBlackBoxTestCase;
|
||||
|
||||
/**
|
||||
|
|
|
@ -16,8 +16,8 @@
|
|||
|
||||
package com.google.zxing.oned;
|
||||
|
||||
import com.google.zxing.MultiFormatReader;
|
||||
import com.google.zxing.BarcodeFormat;
|
||||
import com.google.zxing.MultiFormatReader;
|
||||
import com.google.zxing.common.AbstractBlackBoxTestCase;
|
||||
|
||||
/**
|
||||
|
|
|
@ -16,8 +16,8 @@
|
|||
|
||||
package com.google.zxing.oned;
|
||||
|
||||
import com.google.zxing.MultiFormatReader;
|
||||
import com.google.zxing.BarcodeFormat;
|
||||
import com.google.zxing.MultiFormatReader;
|
||||
import com.google.zxing.common.AbstractBlackBoxTestCase;
|
||||
|
||||
/**
|
||||
|
|
|
@ -16,8 +16,8 @@
|
|||
|
||||
package com.google.zxing.oned;
|
||||
|
||||
import com.google.zxing.MultiFormatReader;
|
||||
import com.google.zxing.BarcodeFormat;
|
||||
import com.google.zxing.MultiFormatReader;
|
||||
import com.google.zxing.common.AbstractBlackBoxTestCase;
|
||||
|
||||
/**
|
||||
|
|
|
@ -16,8 +16,8 @@
|
|||
|
||||
package com.google.zxing.qrcode;
|
||||
|
||||
import com.google.zxing.MultiFormatReader;
|
||||
import com.google.zxing.BarcodeFormat;
|
||||
import com.google.zxing.MultiFormatReader;
|
||||
import com.google.zxing.common.AbstractBlackBoxTestCase;
|
||||
|
||||
/**
|
||||
|
|
|
@ -16,8 +16,8 @@
|
|||
|
||||
package com.google.zxing.qrcode;
|
||||
|
||||
import com.google.zxing.MultiFormatReader;
|
||||
import com.google.zxing.BarcodeFormat;
|
||||
import com.google.zxing.MultiFormatReader;
|
||||
import com.google.zxing.common.AbstractBlackBoxTestCase;
|
||||
|
||||
/**
|
||||
|
|
|
@ -16,8 +16,8 @@
|
|||
|
||||
package com.google.zxing.qrcode;
|
||||
|
||||
import com.google.zxing.MultiFormatReader;
|
||||
import com.google.zxing.BarcodeFormat;
|
||||
import com.google.zxing.MultiFormatReader;
|
||||
import com.google.zxing.common.AbstractBlackBoxTestCase;
|
||||
|
||||
/**
|
||||
|
|
|
@ -16,8 +16,8 @@
|
|||
|
||||
package com.google.zxing.qrcode;
|
||||
|
||||
import com.google.zxing.MultiFormatReader;
|
||||
import com.google.zxing.BarcodeFormat;
|
||||
import com.google.zxing.MultiFormatReader;
|
||||
import com.google.zxing.common.AbstractBlackBoxTestCase;
|
||||
|
||||
/**
|
||||
|
|
|
@ -16,8 +16,8 @@
|
|||
|
||||
package com.google.zxing.qrcode;
|
||||
|
||||
import com.google.zxing.MultiFormatReader;
|
||||
import com.google.zxing.BarcodeFormat;
|
||||
import com.google.zxing.MultiFormatReader;
|
||||
import com.google.zxing.common.AbstractBlackBoxTestCase;
|
||||
|
||||
/**
|
||||
|
|
|
@ -16,7 +16,6 @@
|
|||
|
||||
package com.google.zxing.qrcode.decoder;
|
||||
|
||||
import com.google.zxing.ReaderException;
|
||||
import com.google.zxing.common.BitSourceBuilder;
|
||||
import junit.framework.TestCase;
|
||||
|
||||
|
@ -27,7 +26,7 @@ import junit.framework.TestCase;
|
|||
*/
|
||||
public final class DecodedBitStreamParserTestCase extends TestCase {
|
||||
|
||||
public void testSimpleByteMode() throws ReaderException {
|
||||
public void testSimpleByteMode() throws Exception {
|
||||
BitSourceBuilder builder = new BitSourceBuilder();
|
||||
builder.write(0x04, 4); // Byte mode
|
||||
builder.write(0x03, 8); // 3 bytes
|
||||
|
@ -39,7 +38,7 @@ public final class DecodedBitStreamParserTestCase extends TestCase {
|
|||
assertEquals("\u00f1\u00f2\u00f3", result);
|
||||
}
|
||||
|
||||
public void testSimpleSJIS() throws ReaderException {
|
||||
public void testSimpleSJIS() throws Exception {
|
||||
BitSourceBuilder builder = new BitSourceBuilder();
|
||||
builder.write(0x04, 4); // Byte mode
|
||||
builder.write(0x03, 8); // 3 bytes
|
||||
|
@ -51,7 +50,7 @@ public final class DecodedBitStreamParserTestCase extends TestCase {
|
|||
assertEquals("\uff61\uff62\uff63", result);
|
||||
}
|
||||
|
||||
public void testECI() throws ReaderException {
|
||||
public void testECI() throws Exception {
|
||||
BitSourceBuilder builder = new BitSourceBuilder();
|
||||
builder.write(0x07, 4); // ECI mode
|
||||
builder.write(0x02, 8); // ECI 2 = CP437 encoding
|
||||
|
|
|
@ -16,7 +16,6 @@
|
|||
|
||||
package com.google.zxing.qrcode.decoder;
|
||||
|
||||
import com.google.zxing.ReaderException;
|
||||
import junit.framework.TestCase;
|
||||
|
||||
/**
|
||||
|
@ -51,7 +50,7 @@ public final class VersionTestCase extends TestCase {
|
|||
assertNotNull(version.buildFunctionPattern());
|
||||
}
|
||||
|
||||
public void testGetProvisionalVersionForDimension() throws ReaderException {
|
||||
public void testGetProvisionalVersionForDimension() throws Exception {
|
||||
for (int i = 1; i <= 40; i++) {
|
||||
assertEquals(i, Version.getProvisionalVersionForDimension(4*i + 17).getVersionNumber());
|
||||
}
|
||||
|
|
|
@ -18,9 +18,12 @@ package com.google.zxing.client.j2se;
|
|||
|
||||
import com.google.zxing.BarcodeFormat;
|
||||
import com.google.zxing.BinaryBitmap;
|
||||
import com.google.zxing.ChecksumException;
|
||||
import com.google.zxing.DecodeHintType;
|
||||
import com.google.zxing.FormatException;
|
||||
import com.google.zxing.LuminanceSource;
|
||||
import com.google.zxing.MultiFormatReader;
|
||||
import com.google.zxing.NotFoundException;
|
||||
import com.google.zxing.ReaderException;
|
||||
import com.google.zxing.Result;
|
||||
import com.google.zxing.client.result.ParsedResult;
|
||||
|
@ -210,7 +213,7 @@ public final class CommandLineRunner {
|
|||
", type: " + parsedResult.getType() + "):\nRaw result:\n" + result.getText() +
|
||||
"\nParsed result:\n" + parsedResult.getDisplayResult());
|
||||
return result;
|
||||
} catch (ReaderException e) {
|
||||
} catch (NotFoundException nfe) {
|
||||
System.out.println(uri.toString() + ": No barcode found");
|
||||
return null;
|
||||
} finally {
|
||||
|
@ -247,7 +250,7 @@ public final class CommandLineRunner {
|
|||
for (int y = 0; y < height; y++) {
|
||||
try {
|
||||
row = bitmap.getBlackRow(y, row);
|
||||
} catch (ReaderException e) {
|
||||
} catch (NotFoundException nfe) {
|
||||
// If fetching the row failed, draw a red line and keep going.
|
||||
int offset = y * stride + width;
|
||||
for (int x = 0; x < width; x++) {
|
||||
|
@ -279,7 +282,7 @@ public final class CommandLineRunner {
|
|||
}
|
||||
}
|
||||
}
|
||||
} catch (ReaderException e) {
|
||||
} catch (NotFoundException nfe) {
|
||||
}
|
||||
|
||||
// Write the result
|
||||
|
|
|
@ -18,6 +18,7 @@ package com.google.zxing.client.j2se;
|
|||
|
||||
import com.google.zxing.BinaryBitmap;
|
||||
import com.google.zxing.LuminanceSource;
|
||||
import com.google.zxing.NotFoundException;
|
||||
import com.google.zxing.ReaderException;
|
||||
import com.google.zxing.common.BitArray;
|
||||
import com.google.zxing.common.BitMatrix;
|
||||
|
@ -107,7 +108,7 @@ public final class ImageConverter {
|
|||
for (int y = 0; y < height; y++) {
|
||||
try {
|
||||
array = bitmap.getBlackRow(y, array);
|
||||
} catch (ReaderException e) {
|
||||
} catch (NotFoundException nfe) {
|
||||
// Draw rows with insufficient dynamic range in red
|
||||
for (int x = 0; x < width; x++) {
|
||||
result.setRGB(x, y, RED);
|
||||
|
@ -127,7 +128,7 @@ public final class ImageConverter {
|
|||
result.setRGB(x, y, matrix.get(x, y) ? BLACK : WHITE);
|
||||
}
|
||||
}
|
||||
} catch (ReaderException e) {
|
||||
} catch (NotFoundException nfe) {
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -18,9 +18,12 @@ package com.google.zxing.web;
|
|||
|
||||
import com.google.zxing.BarcodeFormat;
|
||||
import com.google.zxing.BinaryBitmap;
|
||||
import com.google.zxing.ChecksumException;
|
||||
import com.google.zxing.DecodeHintType;
|
||||
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.ReaderException;
|
||||
import com.google.zxing.Result;
|
||||
|
@ -85,7 +88,7 @@ import javax.servlet.http.HttpServletResponse;
|
|||
*/
|
||||
public final class DecodeServlet extends HttpServlet {
|
||||
|
||||
private static final long MAX_IMAGE_SIZE = 500000L;
|
||||
private static final long MAX_IMAGE_SIZE = 2000000L;
|
||||
|
||||
private static final Logger log = Logger.getLogger(DecodeServlet.class.getName());
|
||||
|
||||
|
@ -260,10 +263,18 @@ public final class DecodeServlet extends HttpServlet {
|
|||
LuminanceSource source = new BufferedImageLuminanceSource(image);
|
||||
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
|
||||
result = reader.decode(bitmap, HINTS);
|
||||
} catch (ReaderException re2) {
|
||||
log.info("DECODE FAILED: " + re.toString());
|
||||
} catch (NotFoundException nfe) {
|
||||
log.info("Not found: " + re.toString());
|
||||
response.sendRedirect("notfound.jspx");
|
||||
return;
|
||||
} catch (FormatException fe) {
|
||||
log.info("Format problem: " + re.toString());
|
||||
response.sendRedirect("format.jspx");
|
||||
return;
|
||||
} catch (ChecksumException ce) {
|
||||
log.info("Checksum problem: " + re.toString());
|
||||
response.sendRedirect("format.jspx");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
36
zxingorg/web/format.jspx
Normal file
36
zxingorg/web/format.jspx
Normal file
|
@ -0,0 +1,36 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
Copyright 2008 ZXing authors
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
<!-- Author: Sean Owen -->
|
||||
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="1.2">
|
||||
<jsp:directive.page contentType="text/html" session="false"/>
|
||||
<jsp:scriptlet>response.setHeader("Cache-Control", "public");</jsp:scriptlet>
|
||||
<jsp:text><![CDATA[<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">]]></jsp:text>
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
|
||||
<head>
|
||||
<title>No Barcode Found</title>
|
||||
<link rel="stylesheet" href="style.css" type="text/css"/>
|
||||
</head>
|
||||
<body>
|
||||
<div id="header"><h1><img src="zxing-icon.png" height="32" width="32" alt=""/> Barcode Format Problem</h1></div>
|
||||
<p>A barcode was possibly found in this image, but a problem occurred while decoding it. The data did not conform
|
||||
to the barcode format. This could be due to a misdetection of the barcode, or could indicate a problem
|
||||
with the barcode contents. Go "Back" in your browser and try another image.
|
||||
</p>
|
||||
<jsp:include page="analytics.jspx"/>
|
||||
</body>
|
||||
</html>
|
||||
</jsp:root>
|
Loading…
Reference in a new issue