ZXingとは

ZXing(「ゼブラ・クロッシング」と読む)は、1次元および2次元バーコードのエンコードやデコードををサポートするJavaライブラリである。商品用バーコードやQRコードをはじめとするさまざまな規格に対応しており、バーコード内に埋め込まれた情報を読み取ったり、任意の情報を埋め込んだバーコードを生成したりすることが可能となる。本稿執筆時点の最新版はZXing 1.6であり、次のバーコード規格に対応している。

ZXingはもともとスマートフォン付属のカメラなどで撮影したバーコード画像を処理する目的で開発されたライブラリであり、Java SEのほかにAndroidやJava MEなどでの利用がサポートされている。さらにZXingを使って作成されたAndroidアプリケーションとしてバーコードスキャナーが公開されており、Android端末にインストールして利用することができる。またAndroid Marketなどで公開されているバーコード処理機能を持ったアプリケーションの多くが、このライブラリを利用しているという実績もある。

Java以外にも、各種言語用のモジュールが提供されている。たとえばC#やC++、Ruby、RIM/BlackBerry端末用のモジュールや、iPhone向のObjective C/C++モジュール(QRコードのみ)、ActionScript用のモジュール(一部機能のみ)などがある。

ダウンロードとビルド

ZXingは公式サイトのダウンロードページよりソースコードをダウンロードすることができる。最新版はバージョン1.6なので「ZXing-1.6.zip」というファイルを入手すればよい。

配布ファイルを解凍すると、coreやjavase、androidなどのフォルダが展開される。このうちJava SE上でZXingを利用するのに必要となるのはcoreとjavaseの2つなので、この両フォルダにあるソースコードをビルドしてjarファイルを作成する。ビルドには別途Apache AntApache Mavenが必要。ここではApache Antを使う方法を紹介する。Apache Antを使う場合には、以下のようにそれぞれのフォルダでantコマンドを実行する。

プロンプト1

> cd zxing-1.6\core
> ant
> cd ..\zxing-1.6\javase
> ant

ビルドに成功すると、それぞれ「javase.jar」「core.jar」というjarファイルが生成される。Javaプログラム中でZXingを使うにはこの2つのファイルをクラスパスに含めてコンパイル/実行すればよい。

ZXingによるQRコードの生成

それでは、実際にZXingを使ったプログラムを作ってみよう。今回は任意の文字列情報を格納したQRコードを生成してみる。ZXingの配布ファイル中にはJavadocによるドキュメントが含まれているので、そちらも併せて参照していただきたい。

ZXingでバーコードを生成するにはcom.google.zxing.Writerインタフェースを利用する(java.io.Writerと混同しないように注意)。Writerにはバーコードのフォーマットごとに実装クラスが用意されている。QRコードの場合にはcom.google.zxing.qrcode.QRCodeWriterである。バーコードへのエンコーディングはencode()メソッドを用いて次のように行う。

リスト1

Writer writer = new QRCodeWriter();
BitMatrix bitData = writer.encode
        (コンテンツ, BarcodeFormat.QR_CODE, 幅, 高さ, エンコードヒント);

引数には、バーコードに含ませたいコンテンツ(文字列)、バーコードのフォーマット、幅、高さ、エンコードヒント(エンコードのための付加情報)を指定する。フォーマットはcom.google.zxing.BarcodeFormatクラスのフィールドとして定義されている。エンコードヒントはHashtableオブジェクトとして渡す。

エンコード結果はバーコードのビットデータの2次元マトリックスを保持するBitMatrixオブジェクトとして返される。BitMatrixからはcom.google.zxing.client.j2se.MatrixToImageWriterクラスのwriteToStream()メソッドを利用することで出力ストリームにバーコード画像を書き出すことができる。writeToStream()メソッドにはBitMatrixオブジェクトと出力画像のフォーマット、対象となる出力ストリームを指定する。以下のコードは、「mycode.png」というファイルにバーコード画像を出力する例である。

リスト2

FileOutputStream output = new FileOutputStream("mycode.png");
MatrixToImageWriter.writeToStream(bitData, "png", output);

以下に示すBarcodeWriteSampleは、「マイコミジャーナル: http://journal.mycom.co.jp/」という文字列を格納したQRコードを生成するプログラムの例である。

リスト3

/* import宣言は省略 */

public class BarcodeWriteSample {
    public static void main(String[] args) {
        // バーコードに埋め込むコンテンツ
        String contents = "マイコミジャーナル: http://journal.mycom.co.jp/";

        // エンコードのための付加情報を設定
        Hashtable<EncodeHintType, Object> encodeHint =
                new Hashtable<EncodeHintType, Object>();
        encodeHint.put(EncodeHintType.CHARACTER_SET, "shift_jis");
        encodeHint.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L);

        // QRコード用の出力ストリームを作成
        Writer writer = new QRCodeWriter();

        try {
            // エンコードを実行
            BitMatrix bitData = writer.encode
                    (contents, BarcodeFormat.QR_CODE, 129, 129, encodeHint);
            // ファイルに出力
            FileOutputStream output = new FileOutputStream("mycode.png");
            MatrixToImageWriter.writeToStream(bitData, "png", output);
        } catch (IOException ex) {
            ex.printStackTrace();
        } catch (WriterException ex) {
            ex.printStackTrace();
        }
    }
}

エンコードヒントとしてはcom.google.zxing.EncodeHintTypeに定義されたプロパティが指定できる。現時点では文字コードとエラー訂正レベルが指定できるので、文字コードをShift_JISに、エラー訂正レベルをレベル"L"(7%)に設定している。

このプログラムによって生成されたバーコードが図1である。これを携帯電話のQRコードリーダーで読み取ってみたところ、図2のように指定した文字列が正しく格納されていることを確認できた。

図1 生成されたバーコード

図2 QRコードリーダーで読み取ると正しく表示できた!