iPhoneで使用できる1D/2Dバーコードリーダーライブラリィ 2選

スマートフォンに搭載されているカメラでバーコード、QRコードを読み取り、その情報を利用するという要件は多く、AndroidiPhone共に読み取り用のアプリケーションを開発する為のライブラリィが出ているが、無償で使える、それもiPhoneでとなるとある程度絞られてくるのが現状だ。

ZXing ("Zebra Crossing")
前回も書いたが、ZXingはAndroidではあまりに有名なJavaで書かれたバーコードリーダ用のライブラリィであり、Androidでこの手のアプリケーションを開発する場合は9割方はこのライブラリィかアプリケーションである「QRコードリーダー」を使用しているのではないだろうか。
Androidの特徴であるインテント機能を使い、他のアプリケーションにバーコードの読み取り処理を任せることで、アプリケーションをコンポーネントのように連携できる利点がある。

iPhone対応としては遅れてはいるがこの1〜2年でAndroidとほぼ同様の機能のコードが書かれており、スタティックライブラリィとしてアプリケーションに組み込むことが出来るが※1、Androidのインテントのような連携は用意されていない。(URL Schemaを使うことで読み取った文字列情報を取得することは可能だとは思う)
あと、これは非常に残念なことだが、主に優先度からだと思うが、QRコードに比べて1Dバーコードの実装が遅れており、クラスを切り替える必要がある、読めないバーコードがある等、Androidの実装に比べて対応が遅れている部分が多い。 現在の所はQRコードでの使用が無難だろう。

    • 例)QRコード(2DMode)を読み取るスキャン処理の為のコード
- (IBAction)scan:(id)sender {
  ZXingWidgetController *widController = [[ZXingWidgetController alloc] initWithDelegate:self showCancel:YES OneDMode:NO];
  QRCodeReader* qrcodeReader = [[QRCodeReader alloc] init];
  NSSet *readers = [[NSSet alloc ] initWithObjects:qrcodeReader,nil];
  [qrcodeReader release];
  widController.readers = readers;
  [readers release];
  NSBundle *mainBundle = [NSBundle mainBundle];
  widController.soundToPlay =
  [NSURL fileURLWithPath:[mainBundle pathForResource:@"beep-beep" ofType:@"aiff"] isDirectory:NO];
  [self presentModalViewController:widController animated:YES];
  [widController release];
}

ZXingWidgetControllerのイニシャライザの引数"OnDMode"をYESにして、Readerクラスのインスタンスを1D用のものに交換することで1Dバーコードを読めるようになる。(Androidのようにユニバーサルではないようだ)

ライセンスはApache License 2.0。これがこのライブラリィの人気を押し上げているが、前述したようにAndroidと同じ機能をiPhoneで使うには1Dバーコードの対応が待たれる所だ。

ZBar bar code reader
このライブラリィ、私はつい最近までは知らなかったが、iPhoneAndroidの他Windows、Qt(つまりUNIX C)等をサポートしており、広いプラットホームで使えるようだ。(ようだとしか書けないのは、私はiPhone以外のプラットホームで試したことが無いからである)

iPhone用はスタティックライブラリィとしてアプリケーションに簡単に組み込むことができる。
コードサンプルも実用的なものが用意されており、単独のアプリケーションとしても他のアプリケーションの1機能としても簡単に組み込むことができる。

    • 例)リーダーが読み込んだバーコードの情報を返すデリゲートメソッド
- (void)imagePickerController:(UIImagePickerController*)reader didFinishPickingMediaWithInfo:(NSDictionary*)info
{
    // ADD: get the decode results
    id<NSFastEnumeration> results = [info objectForKey: ZBarReaderControllerResults];
    ZBarSymbol *symbol = nil;
    for(symbol in results)
        // EXAMPLE: just grab the first barcode
        break;

    // EXAMPLE: do something useful with the barcode data
    resultText.text = symbol.data;

    // EXAMPLE: do something useful with the barcode image
    resultImage.image = [info objectForKey: UIImagePickerControllerOriginalImage];

    // ADD: dismiss the controller (NB dismiss from the *reader*!)
    [reader dismissModalViewControllerAnimated: YES];
}

これはサンプルReaderSampleとして提供されているアプリケーション中のコードでバーコードイメージを取得出来た際にフレームワークから呼び出されるメソッドだが、標準のUIKitのUIImagePickerControllerで使用されるUIImagePickerControllerDelegateがそのまま使われており、UIKitの経験者には理解しやすい。
バーコードリーダが読み取った情報はテキスト、イメージとして付加情報の辞書から取得しており、シンプルで分かり易いものだ。

なお、実際に使ってみると判るがZBarのリーダーの読み取り性能は素晴らしい。少々離れていても認識するし、何より速い。気持ち良い位に認識する。

ZBarのライセンスはLGPL 2.1
この素晴らしいライブラリィの使用を唯一留まらせる理由があるとすればこのライセンスが理由になるだろう。

※1 : iOSは現在の所動的に読み込んだライブラリィを使うことが出来ない。