From 6cdc7493d57ddb3bc82bdc28523d961ad138600e Mon Sep 17 00:00:00 2001 From: Sean Owen Date: Fri, 10 Jun 2016 13:58:51 +0100 Subject: [PATCH] Closes Issue #607 : guard against very narrow images which would otherwise cause an exception --- .../common/GlobalHistogramBinarizer.java | 31 ++++++++++++------- 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/core/src/main/java/com/google/zxing/common/GlobalHistogramBinarizer.java b/core/src/main/java/com/google/zxing/common/GlobalHistogramBinarizer.java index b4c0edbd8..3f737587d 100644 --- a/core/src/main/java/com/google/zxing/common/GlobalHistogramBinarizer.java +++ b/core/src/main/java/com/google/zxing/common/GlobalHistogramBinarizer.java @@ -62,22 +62,29 @@ public class GlobalHistogramBinarizer extends Binarizer { byte[] localLuminances = source.getRow(y, luminances); int[] localBuckets = buckets; for (int x = 0; x < width; x++) { - int pixel = localLuminances[x] & 0xff; - localBuckets[pixel >> LUMINANCE_SHIFT]++; + localBuckets[(localLuminances[x] & 0xff) >> LUMINANCE_SHIFT]++; } int blackPoint = estimateBlackPoint(localBuckets); - int left = localLuminances[0] & 0xff; - int center = localLuminances[1] & 0xff; - for (int x = 1; x < width - 1; x++) { - int right = localLuminances[x + 1] & 0xff; - // A simple -1 4 -1 box filter with a weight of 2. - int luminance = ((center * 4) - left - right) / 2; - if (luminance < blackPoint) { - row.set(x); + if (width < 3) { + // Special case for very small images + for (int x = 0; x < width; x++) { + if ((localLuminances[x] & 0xff) < blackPoint) { + row.set(x); + } + } + } else { + int left = localLuminances[0] & 0xff; + int center = localLuminances[1] & 0xff; + for (int x = 1; x < width - 1; x++) { + int right = localLuminances[x + 1] & 0xff; + // A simple -1 4 -1 box filter with a weight of 2. + if (((center * 4) - left - right) / 2 < blackPoint) { + row.set(x); + } + left = center; + center = right; } - left = center; - center = right; } return row; }