ZXing で二次元バーコードを作成した際の覚書

スタンドアローンで動作する二次元バーコード作成ソフトを探したところ、文字コードや余白やマスク処理について指定できそうな適当なものが見つかりませんでした。

探し続ければ良いものがあるのかもしれません。

しかし限られた時間中に見つけられる保証もなかったので Java で作成してしまうことに決めました。

なぜ Java なのかは — 単純に Android で用いられることから、最新の状態で整備されているバーコード作成ライブラリが簡単に見つかるような気がしたからです。




検索してみたところ、実際に ZXing Project というプロジェクトが見つかります。

今回はこのプロジェクトを こちら から zip 形式でダウンロードした後、Apache Maven を使用してビルドして使用します。

$ unzip zxing-master.zip
$ cd zxing-master
$ mvn package

私の場合はエラーを出力してビルドに失敗してしまいました。

[WARNING] Rule 4: org.apache.maven.plugins.enforcer.RequireMavenVersion failed with message:
Detected Maven Version: 3.1.1 is not in the allowed range 3.2.5.

このようなエラーメッセージが現れた場合、Maven のバージョンが合致していない事が示されていますので、該当のバージョンをインストールしてやると大体はうまくいきます。

うまくビルドに成功した場合、 core ディレクトリ直下に tagert ディレクトリが作成されます。

使用したいのはその中にある core-3.3.1-SNAPSHOT.jar というファイルです。

パスで示すと次のような具合になります。

zxing-master/core/target/core-3.3.1-SNAPSHOT.jar

この jar ファイルにパスを通して com.google.zxing パッケージとそれに属する必要なクラスを参照すると、二次元バーコードを簡単に作成できるようになります。

import com.google.zxing.*;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;

入出力の必要に応じて java.awt 等の他パッケージのクラスもインポートしてください。

インポートができたら QRCodeWriter の encode メソッドを使用して BitMatrix を生成します。

この際に予め Map < EncodeHintType, Object > hintMap を作成しておくと引数として文字コードや余白を指定できます。

/* hintMap を作成して引数を指定 */
Map  hintMap = new EnumMap (EncodeHintType.class);
hintMap.put(EncodeHintType.MARGIN, 1);
// EncodeHintType.QR_VERSION , EncodeHintType.CHARACTER_SET , EncodeHintType.ERROR_CORRECTION などの設定項目をキー、設定をバリューとして hintMap の引数に与えることで他の具体的な設定もできます
/* BitMatrix を生成 */
BitMatrix matrix = new QRCodeWriter().encode("入力文字列", BarcodeFormat.QR_CODE, 横サイズ, 縦サイズ, hintMap);
// WriterException を吐きます
// 引数の横サイズと縦サイズは int 型の数字を入れてください

上で作成した BitMatrix を使ってグラフィカルイメージを作成します。

BufferedImage image = new BufferedImage(matrix.getWidth(), matrix.getWidth(), BufferedImage.TYPE_INT_RGB);
image.createGraphics();

あとは他の画像編集などと同様に、Graphics / Graphics2D クラスなど使用して作成した image を編集したり、出力したりしてください。

これに例えばテキストファイルの読み込みを組み合わせれば、エラーの原因ともなる煩わしいコピー&ペーストから解放されるので、とても便利に使えます。

私はこの分野にあまり詳しくなかったのですが、コードを読み込んでいくうちにバージョン、マスク、誤り訂正など基本的な機能を勉強することもでき、なるほどと思わず関心してしまいました。

Leave a Reply

Your email address will not be published. Required fields are marked *