diff --git a/core/src/com/google/zxing/common/detector/WhiteRectangleDetector.java b/core/src/com/google/zxing/common/detector/WhiteRectangleDetector.java index 030d3a271..f5bd28929 100644 --- a/core/src/com/google/zxing/common/detector/WhiteRectangleDetector.java +++ b/core/src/com/google/zxing/common/detector/WhiteRectangleDetector.java @@ -83,6 +83,11 @@ public final class WhiteRectangleDetector { aBlackPointFoundOnBorder = true; } } + + if (right >= width) { + sizeExceeded = true; + break; + } // ..... // . . @@ -95,6 +100,11 @@ public final class WhiteRectangleDetector { aBlackPointFoundOnBorder = true; } } + + if (down >= height) { + sizeExceeded = true; + break; + } // ..... // | . @@ -107,6 +117,11 @@ public final class WhiteRectangleDetector { aBlackPointFoundOnBorder = true; } } + + if (left < 0) { + sizeExceeded = true; + break; + } // .___. // . . @@ -120,7 +135,7 @@ public final class WhiteRectangleDetector { } } - if (right >= width || down >= height || up < 0 || left < 0) { + if (up < 0) { sizeExceeded = true; break; } @@ -271,20 +286,26 @@ public final class WhiteRectangleDetector { private boolean containsBlackPoint(int a, int b, int fixed, boolean horizontal) { if (horizontal) { - for (int x = a; x < b; x++) { + for (int x = a; x <= b; x++) { + if (x>=480 || x < 0 || fixed >= 360 || fixed < 0){ + x++; + } if (image.get(x, fixed)) { return true; } } } else { - for (int y = a; y < b; y++) { + for (int y = a; y <= b; y++) { + if (y>=360 || y < 0 || fixed >= 480 || fixed < 0){ + y++; + } if (image.get(fixed, y)) { return true; } - } } - - return false; } + return false; + } + } \ No newline at end of file diff --git a/core/src/com/google/zxing/datamatrix/detector/Detector.java b/core/src/com/google/zxing/datamatrix/detector/Detector.java index 206e5187c..ca1918f75 100644 --- a/core/src/com/google/zxing/datamatrix/detector/Detector.java +++ b/core/src/com/google/zxing/datamatrix/detector/Detector.java @@ -151,6 +151,9 @@ public final class Detector { //correct top right point to match the white module ResultPoint correctedTopRight = correctTopRight(bottomLeft, bottomRight, topLeft, topRight, dimension); + if (correctedTopRight == null){ + correctedTopRight = topRight; + } //We redetermine the dimension using the corrected top right point int dimension2 = Math.max(transitionsBetween(topLeft, correctedTopRight).getTransitions(), @@ -188,6 +191,15 @@ public final class Detector { ResultPoint c2 = new ResultPoint(topRight.getX()+corr*cos, topRight.getY()+corr*sin); + if (!isValid(c1)){ + if (isValid(c2)){ + return c2; + } + return null; + } else if (!isValid(c2)){ + return c1; + } + int l1 = Math.abs(transitionsBetween(topLeft, c1).getTransitions() - transitionsBetween(bottomRight, c1).getTransitions()); int l2 = Math.abs(transitionsBetween(topLeft, c2).getTransitions() - transitionsBetween(bottomRight, c2).getTransitions()); @@ -198,7 +210,11 @@ public final class Detector { return c2; } - // L2 distance + private boolean isValid(ResultPoint p) { + return (p.getX() >= 0 && p.getX() < image.width && p.getY() > 0 && p.getY() < image.height); + } + +// L2 distance private static int distance(ResultPoint a, ResultPoint b) { return (int) Math.round(Math.sqrt((a.getX() - b.getX()) * (a.getX() - b.getX()) + (a.getY() - b.getY())