mirror of
https://github.com/zxing/zxing.git
synced 2025-02-02 05:41:08 -08:00
Adds orientation of pdf417 barcode to Result metadata (#1522)
* Adds orientation of pdf417 barcode to Result metadata Co-authored-by: Jordan Wild <jwild@simplenexus.com>
This commit is contained in:
parent
83cdc82aa1
commit
c7a7b30f04
|
@ -286,6 +286,27 @@ public final class BitMatrix implements Cloneable {
|
||||||
System.arraycopy(row.getBitArray(), 0, bits, y * rowSize, rowSize);
|
System.arraycopy(row.getBitArray(), 0, bits, y * rowSize, rowSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Modifies this {@code BitMatrix} to represent the same but rotated the given degrees (multiple of 0, 90, 180, 270)
|
||||||
|
*/
|
||||||
|
public void rotate(int degrees) {
|
||||||
|
switch (degrees % 360) {
|
||||||
|
case 0:
|
||||||
|
return;
|
||||||
|
case 90:
|
||||||
|
rotate90();
|
||||||
|
return;
|
||||||
|
case 180:
|
||||||
|
rotate180();
|
||||||
|
return;
|
||||||
|
case 270:
|
||||||
|
rotate90();
|
||||||
|
rotate180();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
throw new IllegalArgumentException("degrees must be a multiple of 0, 90, 180, or 270");
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Modifies this {@code BitMatrix} to represent the same but rotated 180 degrees
|
* Modifies this {@code BitMatrix} to represent the same but rotated 180 degrees
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -94,6 +94,7 @@ public final class PDF417Reader implements Reader, MultipleBarcodeReader {
|
||||||
if (pdf417ResultMetadata != null) {
|
if (pdf417ResultMetadata != null) {
|
||||||
result.putMetadata(ResultMetadataType.PDF417_EXTRA_METADATA, pdf417ResultMetadata);
|
result.putMetadata(ResultMetadataType.PDF417_EXTRA_METADATA, pdf417ResultMetadata);
|
||||||
}
|
}
|
||||||
|
result.putMetadata(ResultMetadataType.ORIENTATION, detectorResult.getRotation());
|
||||||
result.putMetadata(ResultMetadataType.SYMBOLOGY_IDENTIFIER, "]L" + decoderResult.getSymbologyModifier());
|
result.putMetadata(ResultMetadataType.SYMBOLOGY_IDENTIFIER, "]L" + decoderResult.getSymbologyModifier());
|
||||||
results.add(result);
|
results.add(result);
|
||||||
}
|
}
|
||||||
|
|
|
@ -57,6 +57,7 @@ public final class Detector {
|
||||||
// ensure we don't miss it.
|
// ensure we don't miss it.
|
||||||
private static final int ROW_STEP = 5;
|
private static final int ROW_STEP = 5;
|
||||||
private static final int BARCODE_MIN_HEIGHT = 10;
|
private static final int BARCODE_MIN_HEIGHT = 10;
|
||||||
|
private static final int[] ROTATIONS = {0, 180, 270, 90};
|
||||||
|
|
||||||
private Detector() {
|
private Detector() {
|
||||||
}
|
}
|
||||||
|
@ -77,20 +78,31 @@ public final class Detector {
|
||||||
// different binarizers
|
// different binarizers
|
||||||
//boolean tryHarder = hints != null && hints.containsKey(DecodeHintType.TRY_HARDER);
|
//boolean tryHarder = hints != null && hints.containsKey(DecodeHintType.TRY_HARDER);
|
||||||
|
|
||||||
BitMatrix bitMatrix = image.getBlackMatrix();
|
BitMatrix originalMatrix = image.getBlackMatrix();
|
||||||
|
for (int rotation : ROTATIONS) {
|
||||||
List<ResultPoint[]> barcodeCoordinates = detect(multiple, bitMatrix);
|
BitMatrix bitMatrix = applyRotation(originalMatrix, rotation);
|
||||||
// Try 180, 270, 90 degree rotations, in that order
|
List<ResultPoint[]> barcodeCoordinates = detect(multiple, bitMatrix);
|
||||||
for (int rotate = 0; barcodeCoordinates.isEmpty() && rotate < 3; rotate++) {
|
if (!barcodeCoordinates.isEmpty()) {
|
||||||
bitMatrix = bitMatrix.clone();
|
return new PDF417DetectorResult(bitMatrix, barcodeCoordinates, rotation);
|
||||||
if (rotate != 1) {
|
|
||||||
bitMatrix.rotate180();
|
|
||||||
} else {
|
|
||||||
bitMatrix.rotate90();
|
|
||||||
}
|
}
|
||||||
barcodeCoordinates = detect(multiple, bitMatrix);
|
|
||||||
}
|
}
|
||||||
return new PDF417DetectorResult(bitMatrix, barcodeCoordinates);
|
return new PDF417DetectorResult(originalMatrix, new ArrayList<>(), 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Applies a rotation to the supplied BitMatrix.
|
||||||
|
* @param matrix bit matrix to apply rotation to
|
||||||
|
* @param rotation the degrees of rotation to apply
|
||||||
|
* @return BitMatrix with applied rotation
|
||||||
|
*/
|
||||||
|
private static BitMatrix applyRotation(BitMatrix matrix, int rotation) {
|
||||||
|
if (rotation % 360 == 0) {
|
||||||
|
return matrix;
|
||||||
|
}
|
||||||
|
|
||||||
|
BitMatrix newMatrix = matrix.clone();
|
||||||
|
newMatrix.rotate(rotation);
|
||||||
|
return newMatrix;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -28,10 +28,16 @@ public final class PDF417DetectorResult {
|
||||||
|
|
||||||
private final BitMatrix bits;
|
private final BitMatrix bits;
|
||||||
private final List<ResultPoint[]> points;
|
private final List<ResultPoint[]> points;
|
||||||
|
private final int rotation;
|
||||||
|
|
||||||
public PDF417DetectorResult(BitMatrix bits, List<ResultPoint[]> points) {
|
public PDF417DetectorResult(BitMatrix bits, List<ResultPoint[]> points, int rotation) {
|
||||||
this.bits = bits;
|
this.bits = bits;
|
||||||
this.points = points;
|
this.points = points;
|
||||||
|
this.rotation = rotation;
|
||||||
|
}
|
||||||
|
|
||||||
|
public PDF417DetectorResult(BitMatrix bits, List<ResultPoint[]> points) {
|
||||||
|
this(bits, points, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
public BitMatrix getBits() {
|
public BitMatrix getBits() {
|
||||||
|
@ -42,4 +48,8 @@ public final class PDF417DetectorResult {
|
||||||
return points;
|
return points;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getRotation() {
|
||||||
|
return rotation;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue