ZXingでバーコードアプリ開発

最近、スマホアプリ開発の勉強として VS2019のxamarinとC#とZXingの組み合わせでAndroid版のバーコードアプリを作っています。

バーコードの読み取り、書き出しの両方に対応させようとしていますが、おかげで、かなり勉強になりました。

GS1-128のFNC1のエンコードを通して文字コードの勉強になりましたし、QRコードはデンソーウェーブの登録商標であるとか、デンソーウェーブがQRコードサービスで位置情報を無断で収集していたとか、興味深い情報も初めて知りました。

最初は雑誌のQRコードを読み込んでから自作アプリでエンコードすると同じ模様のQRコードが作れなくて悩みました。

バーコードは枯れた技術ですが奥が深い・・・。

ちなみに、バーコードSDKのZxingには問題がいくつかあったのでメモ。

(1)ZXingScannerViewが頻繁にフリーズ

バーコードをスキャンしてからスキャン結果の画面に移動し、再びZXingScannerViewを埋め込んだ画面に戻るとZXingScannerViewがわりと簡単にフリーズします。こちらは、ZXing.Net.Mobileが2020年3月に2年ぶりにバグ修正をして更新されています。バージョンは「3.0.0-beta5」とベータ版なのですが、こちらにアップデートするとフリーズしなくなりました。

NuGetで検索キーワードに「ZXing.Net.Mobile」を指定する際に「プレリリース」にチェックを入れると開発環境にインストールできます。

(2)EAN13やEAN8、GS1-128の下段の数字が印字できない

バーコードを作成するときのオプションで「PureBarcode」プロパティがあります。EAN13などは通常、下段にバーコードモジュールの下部に数字が印字されますが、この「PureBarcode」をfalseに設定すると数字も一緒に出力されます。

しかし、

ZXing.BarcodeWriterPixelData writer = new BarcodeWriterPixelData();

writer.Format = BarcodeFormat.EAN_13;

writer.Options.PureBarcode = false;

としても、バーコード画像の下段にエンコードする前の数字が印字されません。どうやら、Androidでは有効にはならないようです。

対策として、自分で数字のBitmapを作ってCanvasオブジェクトで重ね合わせれば何とかなります。力技ですね。

(3)GS1-128などの高密度の1次元コードの読み取りが極端に弱い

ZXingScannerViewを使っているのですが、わりとQRコードなどは高密度でもすんなりとデコードしてくれます。しかし、GS1-128などの高密度の1次元コードは全然、読み込んでくれません。でも、他社さんのスマホバーコードアプリで高速読み取りを謳い文句にしているソフトは速攻でGS1-128も読み込みます。

違いはなんだろ・・・?

そこで、「ZXing 認識率」で検索すると結構、対策がヒットします。2値画像処理など、まだまだやれることはありそうです。

ZXingScannerViewに頼らず、カメラ画像を加工してからZXingに食わすのがいいのかもしれません。