diff options
author | Dominik Schürmann <dominik@dominikschuermann.de> | 2013-10-05 20:43:42 +0200 |
---|---|---|
committer | Dominik Schürmann <dominik@dominikschuermann.de> | 2013-10-05 20:43:42 +0200 |
commit | 05cc2023daa57bfdb813e478ddb61c1b2f3156c4 (patch) | |
tree | da2d163c9bf75ea95edd023ff6a842534b2851e2 /OpenPGP-Keychain/src/com/google/zxing/multi/GenericMultipleBarcodeReader.java | |
parent | bef6977aade3a901ac17ed1e31de22c8de066921 (diff) | |
download | open-keychain-05cc2023daa57bfdb813e478ddb61c1b2f3156c4.tar.gz open-keychain-05cc2023daa57bfdb813e478ddb61c1b2f3156c4.tar.bz2 open-keychain-05cc2023daa57bfdb813e478ddb61c1b2f3156c4.zip |
Add parts of zxing library to generate qr codes
Diffstat (limited to 'OpenPGP-Keychain/src/com/google/zxing/multi/GenericMultipleBarcodeReader.java')
-rw-r--r-- | OpenPGP-Keychain/src/com/google/zxing/multi/GenericMultipleBarcodeReader.java | 156 |
1 files changed, 156 insertions, 0 deletions
diff --git a/OpenPGP-Keychain/src/com/google/zxing/multi/GenericMultipleBarcodeReader.java b/OpenPGP-Keychain/src/com/google/zxing/multi/GenericMultipleBarcodeReader.java new file mode 100644 index 000000000..70d454251 --- /dev/null +++ b/OpenPGP-Keychain/src/com/google/zxing/multi/GenericMultipleBarcodeReader.java @@ -0,0 +1,156 @@ +/* + * Copyright 2009 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.multi; + +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; +import java.util.Vector; + +/** + * <p>Attempts to locate multiple barcodes in an image by repeatedly decoding portion of the image. + * After one barcode is found, the areas left, above, right and below the barcode's + * {@link com.google.zxing.ResultPoint}s are scanned, recursively.</p> + * + * <p>A caller may want to also employ {@link ByQuadrantReader} when attempting to find multiple + * 2D barcodes, like QR Codes, in an image, where the presence of multiple barcodes might prevent + * detecting any one of them.</p> + * + * <p>That is, instead of passing a {@link Reader} a caller might pass + * <code>new ByQuadrantReader(reader)</code>.</p> + * + * @author Sean Owen + */ +public final class GenericMultipleBarcodeReader implements MultipleBarcodeReader { + + private static final int MIN_DIMENSION_TO_RECUR = 100; + + private final Reader delegate; + + public GenericMultipleBarcodeReader(Reader delegate) { + this.delegate = delegate; + } + + public Result[] decodeMultiple(BinaryBitmap image) throws NotFoundException { + return decodeMultiple(image, null); + } + + public Result[] decodeMultiple(BinaryBitmap image, Hashtable hints) + throws NotFoundException { + Vector results = new Vector(); + doDecodeMultiple(image, hints, results, 0, 0); + if (results.isEmpty()) { + throw NotFoundException.getNotFoundInstance(); + } + int numResults = results.size(); + Result[] resultArray = new Result[numResults]; + for (int i = 0; i < numResults; i++) { + resultArray[i] = (Result) results.elementAt(i); + } + return resultArray; + } + + private void doDecodeMultiple(BinaryBitmap image, + Hashtable hints, + Vector results, + int xOffset, + int yOffset) { + Result result; + try { + result = delegate.decode(image, hints); + } catch (ReaderException re) { + return; + } + boolean alreadyFound = false; + for (int i = 0; i < results.size(); i++) { + Result existingResult = (Result) results.elementAt(i); + if (existingResult.getText().equals(result.getText())) { + alreadyFound = true; + break; + } + } + if (alreadyFound) { + return; + } + results.addElement(translateResultPoints(result, xOffset, yOffset)); + ResultPoint[] resultPoints = result.getResultPoints(); + if (resultPoints == null || resultPoints.length == 0) { + return; + } + int width = image.getWidth(); + int height = image.getHeight(); + float minX = width; + float minY = height; + float maxX = 0.0f; + float maxY = 0.0f; + for (int i = 0; i < resultPoints.length; i++) { + ResultPoint point = resultPoints[i]; + float x = point.getX(); + float y = point.getY(); + if (x < minX) { + minX = x; + } + if (y < minY) { + minY = y; + } + if (x > maxX) { + maxX = x; + } + if (y > maxY) { + maxY = y; + } + } + + // Decode left of barcode + if (minX > MIN_DIMENSION_TO_RECUR) { + doDecodeMultiple(image.crop(0, 0, (int) minX, height), + hints, results, xOffset, yOffset); + } + // Decode above barcode + if (minY > MIN_DIMENSION_TO_RECUR) { + doDecodeMultiple(image.crop(0, 0, width, (int) minY), + hints, results, xOffset, yOffset); + } + // Decode right of barcode + if (maxX < width - MIN_DIMENSION_TO_RECUR) { + doDecodeMultiple(image.crop((int) maxX, 0, width - (int) maxX, height), + hints, results, xOffset + (int) maxX, yOffset); + } + // Decode below barcode + if (maxY < height - MIN_DIMENSION_TO_RECUR) { + doDecodeMultiple(image.crop(0, (int) maxY, width, height - (int) maxY), + hints, results, xOffset, yOffset + (int) maxY); + } + } + + private static Result translateResultPoints(Result result, int xOffset, int yOffset) { + ResultPoint[] oldResultPoints = result.getResultPoints(); + ResultPoint[] newResultPoints = new ResultPoint[oldResultPoints.length]; + for (int i = 0; i < oldResultPoints.length; i++) { + ResultPoint oldPoint = oldResultPoints[i]; + newResultPoints[i] = new ResultPoint(oldPoint.getX() + xOffset, oldPoint.getY() + yOffset); + } + return new Result(result.getText(), result.getRawBytes(), newResultPoints, + result.getBarcodeFormat()); + } + +} |