123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 |
- /*
- * Copyright 2012 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.
- */
-
- #import "ZXBarcodeFormat.h"
- #import "ZXBinaryBitmap.h"
- #import "ZXBitMatrix.h"
- #import "ZXDecodeHints.h"
- #import "ZXDecoderResult.h"
- #import "ZXDetectorResult.h"
- #import "ZXErrors.h"
- #import "ZXPDF417Common.h"
- #import "ZXPDF417Detector.h"
- #import "ZXPDF417DetectorResult.h"
- #import "ZXPDF417Reader.h"
- #import "ZXPDF417ResultMetadata.h"
- #import "ZXPDF417ScanningDecoder.h"
- #import "ZXResult.h"
- #import "ZXResultPoint.h"
-
- @implementation ZXPDF417Reader
-
- /**
- * Locates and decodes a PDF417 code in an image.
- *
- * @return a String representing the content encoded by the PDF417 code
- * @return nil if a PDF417 code cannot be found,
- * @return nil if a PDF417 cannot be decoded
- */
- - (ZXResult *)decode:(ZXBinaryBitmap *)image error:(NSError **)error {
- return [self decode:image hints:nil error:error];
- }
-
- - (ZXResult *)decode:(ZXBinaryBitmap *)image hints:(ZXDecodeHints *)hints error:(NSError **)error {
- NSArray *result = [self decode:image hints:hints multiple:NO error:error];
- if (!result || result.count == 0 || !result[0]) {
- if (error) *error = ZXNotFoundErrorInstance();
- return nil;
- }
- return result[0];
- }
-
- - (NSArray *)decodeMultiple:(ZXBinaryBitmap *)image error:(NSError **)error {
- return [self decodeMultiple:image hints:nil error:error];
- }
-
- - (NSArray *)decodeMultiple:(ZXBinaryBitmap *)image hints:(ZXDecodeHints *)hints error:(NSError **)error {
- return [self decode:image hints:hints multiple:YES error:error];
- }
-
- - (NSArray *)decode:(ZXBinaryBitmap *)image hints:(ZXDecodeHints *)hints multiple:(BOOL)multiple error:(NSError **)error {
- NSMutableArray *results = [NSMutableArray array];
- ZXPDF417DetectorResult *detectorResult = [ZXPDF417Detector detect:image hints:hints multiple:multiple error:error];
- if (!detectorResult) {
- return nil;
- }
- for (NSArray *points in detectorResult.points) {
- ZXResultPoint *imageTopLeft = points[4] == [NSNull null] ? nil : points[4];
- ZXResultPoint *imageBottomLeft = points[5] == [NSNull null] ? nil : points[5];
- ZXResultPoint *imageTopRight = points[6] == [NSNull null] ? nil : points[6];
- ZXResultPoint *imageBottomRight = points[7] == [NSNull null] ? nil : points[7];
-
- ZXDecoderResult *decoderResult = [ZXPDF417ScanningDecoder decode:detectorResult.bits
- imageTopLeft:imageTopLeft
- imageBottomLeft:imageBottomLeft
- imageTopRight:imageTopRight
- imageBottomRight:imageBottomRight
- minCodewordWidth:[self minCodewordWidth:points]
- maxCodewordWidth:[self maxCodewordWidth:points]
- error:error];
- if (!decoderResult) {
- return nil;
- }
- ZXResult *result = [[ZXResult alloc] initWithText:decoderResult.text
- rawBytes:decoderResult.rawBytes
- resultPoints:points
- format:kBarcodeFormatPDF417];
- [result putMetadata:kResultMetadataTypeErrorCorrectionLevel value:decoderResult.ecLevel];
- ZXPDF417ResultMetadata *pdf417ResultMetadata = decoderResult.other;
- if (pdf417ResultMetadata) {
- [result putMetadata:kResultMetadataTypePDF417ExtraMetadata value:pdf417ResultMetadata];
- }
- [results addObject:result];
- }
- return [NSArray arrayWithArray:results];
- }
-
- - (int)maxWidth:(ZXResultPoint *)p1 p2:(ZXResultPoint *)p2 {
- if (!p1 || !p2 || (id)p1 == [NSNull null] || p2 == (id)[NSNull null]) {
- return 0;
- }
- return fabsf(p1.x - p2.x);
- }
-
- - (int)minWidth:(ZXResultPoint *)p1 p2:(ZXResultPoint *)p2 {
- if (!p1 || !p2 || (id)p1 == [NSNull null] || p2 == (id)[NSNull null]) {
- return INT_MAX;
- }
- return fabsf(p1.x - p2.x);
- }
-
- - (int)maxCodewordWidth:(NSArray *)p {
- return MAX(
- MAX([self maxWidth:p[0] p2:p[4]], [self maxWidth:p[6] p2:p[2]] * ZX_PDF417_MODULES_IN_CODEWORD /
- ZX_PDF417_MODULES_IN_STOP_PATTERN),
- MAX([self maxWidth:p[1] p2:p[5]], [self maxWidth:p[7] p2:p[3]] * ZX_PDF417_MODULES_IN_CODEWORD /
- ZX_PDF417_MODULES_IN_STOP_PATTERN));
- }
-
- - (int)minCodewordWidth:(NSArray *)p {
- return MIN(
- MIN([self minWidth:p[0] p2:p[4]], [self minWidth:p[6] p2:p[2]] * ZX_PDF417_MODULES_IN_CODEWORD /
- ZX_PDF417_MODULES_IN_STOP_PATTERN),
- MIN([self minWidth:p[1] p2:p[5]], [self minWidth:p[7] p2:p[3]] * ZX_PDF417_MODULES_IN_CODEWORD /
- ZX_PDF417_MODULES_IN_STOP_PATTERN));
- }
-
- - (void)reset {
- // nothing needs to be reset
- }
-
- @end
|