使用Swift 2和ZXingObjC生成数据矩阵

时间:2016-04-22 13:19:40

标签: swift zxing datamatrix

我的问题如下:我想用ZXingObjC生成一个数据矩阵并显示它。

目前我正在编写一个使用XCode 7.3和Swift 2.have的应用程序来生成一个带有String值的数据矩阵。作为用Objective C编写的ZXingObjC,我试图根据这个例子自己转换它:


    NSError *error = nil;
    ZXMultiFormatWriter *writer = [ZXMultiFormatWriter writer];
    ZXBitMatrix* result = [writer encode:@"A string to encode"
                                  format:kBarcodeFormatQRCode
                                  width:500
                                  height:500
                                  error:&error];
    if (result) {
      CGImageRef image = [[ZXImage imageWithMatrix:result] cgimage];

    } else {
      NSString *errorMessage = [error localizedDescription];
    }

当我尝试使用writer.encode(...)对我的String进行编码时会出现问题,我认为我确实尝试使用更长更小的字符串但结果仍然相同。


    do {
        let writer = ZXMultiFormatWriter()
        let hints = ZXEncodeHints() as ZXEncodeHints
        let result = try writer.encode("foo", format: kBarcodeFormatDataMatrix, width: 300, height: 300, hints: hints)

        let imageRef = ZXImage.init(matrix: result)
        picture.image = UIImage(CGImage: imageRef.cgimage)
    }
    catch {
        print(error)
    }

最后,应用程序因此异常而崩溃:


    *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Can't find a symbol arrangement that matches the message. Data codewords: 17'
    *** First throw call stack:
    (
        0   CoreFoundation                      0x00000001081b7d85 __exceptionPreprocess + 165
        1   libobjc.A.dylib                     0x000000010854cdeb objc_exception_throw + 48
        2   CoreFoundation                      0x00000001081b7cbd +[NSException raise:format:] + 205
        3   ZXingObjC                           0x0000000107eb320a +[ZXDataMatrixSymbolInfo lookup:shape:minSize:maxSize:fail:] + 1178
        4   ZXingObjC                           0x0000000107ead4bb -[ZXDataMatrixEncoderContext updateSymbolInfoWithLength:] + 379
        5   ZXingObjC                           0x0000000107ea2866 -[ZXDataMatrixC40Encoder encode:] + 342
        6   ZXingObjC                           0x0000000107eaf032 +[ZXDataMatrixHighLevelEncoder encodeHighLevel:shape:minSize:maxSize:] + 1330
        7   ZXingObjC                           0x0000000107eb75b0 -[ZXDataMatrixWriter encode:format:width:height:hints:error:] + 672
        8   ZXingObjC                           0x0000000107ee246c -[ZXMultiFormatWriter encode:format:width:height:hints:error:] + 1100
        9   DemoAppZXing                        0x0000000103f54d98 _TFC4DemoAppZXing27VSMatrixOrderViewController11viewDidLoadfT_T_ + 8472
        10  DemoAppZXing                        0x0000000103f58002 _TToFC4DemoAppZXing27VSMatrixOrderViewController11viewDidLoadfT_T_ + 34
        11  UIKit                               0x0000000106a95984 -[UIViewController loadViewIfRequired] + 1198
        12  UIKit                               0x0000000106a9b93b -[UIViewController __viewWillAppear:] + 120
        13  UIKit                               0x0000000106acb750 -[UINavigationController _startCustomTransition:] + 1203
        14  UIKit                               0x0000000106adbb9b -[UINavigationController _startDeferredTransitionIfNeeded:] + 712
        15  UIKit                               0x0000000106adcd0b -[UINavigationController __viewWillLayoutSubviews] + 57
        16  UIKit                               0x0000000106c8b503 -[UILayoutContainerView layoutSubviews] + 248
        17  UIKit                               0x00000001069b5980 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 703
        18  QuartzCore                          0x000000010a2bfc00 -[CALayer layoutSublayers] + 146
        19  QuartzCore                          0x000000010a2b408e _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 366
        20  QuartzCore                          0x000000010a2b3f0c _ZN2CA5Layer28layout_and_display_if_neededEPNS_11TransactionE + 24
        21  QuartzCore                          0x000000010a2a83c9 _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 277
        22  QuartzCore                          0x000000010a2d6086 _ZN2CA11Transaction6commitEv + 486
        23  UIKit                               0x00000001068f572e _UIApplicationHandleEventQueue + 7135
        24  CoreFoundation                      0x00000001080dd301 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17
        25  CoreFoundation                      0x00000001080d322c __CFRunLoopDoSources0 + 556
        26  CoreFoundation                      0x00000001080d26e3 __CFRunLoopRun + 867
        27  CoreFoundation                      0x00000001080d20f8 CFRunLoopRunSpecific + 488
        28  GraphicsServices                    0x000000010a8a1ad2 GSEventRunModal + 161
        29  UIKit                               0x00000001068faf09 UIApplicationMain + 171
        30  DemoAppZXing                        0x0000000103f60ec2 main + 114
        31  libdyld.dylib                       0x000000010905492d start + 1
    )
    libc++abi

.dylib: terminating with uncaught exception of type NSException

修改:

要解决这个问题,我只需要设置minSize和maxSize。


    let hints = ZXEncodeHints() as ZXEncodeHints
    hints.maxSize = ZXDimension.init(width: 1000, height: 1000)
    hints.minSize = ZXDimension.init(width: 1, height: 1)

    let result = try writer.encode(generatedStr[0], format: kBarcodeFormatDataMatrix, width: 500, height: 500, hints: hints)

2 个答案:

答案 0 :(得分:0)

我认为这是一个“通用错误”,与Swift无关,而是Zebra Crossing / ZXing。尝试使矩形更大,可能会有所帮助。

let result = try writer.encode("foo", format: kBarcodeFormatDataMatrix, width: 1000, height: 1000, hints: hints)

答案 1 :(得分:0)

以最终形式返回UIImage的方法:

func generateDataMatrixQRCode(from string: String) -> UIImage? {
    do {
        let writer = ZXMultiFormatWriter()
        let hints = ZXEncodeHints() as ZXEncodeHints
        let result = try writer.encode(string, format: kBarcodeFormatDataMatrix, width: 1000, height: 1000, hints: hints)

        if let imageRef = ZXImage.init(matrix: result) {
            if let image = imageRef.cgimage {
                return UIImage.init(cgImage: image)
            }
        }
    }
    catch {
        print(error)
    }
    return nil
}