Java

ZXingを使ってAztecコードの生成/読み取りを行う

ZXing_Aztecコードの生成と読み取りを行う

前回の記事では、ZXingを使ってQRコードを生成する方法を解説しました。

ZXingを使ってQRコードの生成/読み取りを行うURLやSNSのIDなど、さまざな情報を共有できる手段として QRコード は浸透してきました。人間にはそのQRコードに格納された情報を理...

本稿では、二次元コードを生成できる Java のライブラリ ZXing を使って、Aztec コードを生成/読み取りする方法について解説します。

こんな人におすすめ
  • AmazonGoに採用されてからAztecに注目している
  • QRコード以外の二次元コードに興味があり、自分で生成したい

Aztecとは

Aztec は、中央のファインダーコードがアステカ文明のピラミッドを上から見た形と似ていることを名前の由来するマトリクス型コードであり、非常に高い情報化密度を持っていることが特長です。航空券などの旅行書類や自動車の登録書類に使われています。2018年1月22日にアメリカ・シアトルにオープンしたAmazon Goでは、入店時にかざす二次元バーコードに採用されています。

セットアップ

ZXingはGithubのページ https://github.com/zxing/zxing ではjarが配布されていません。Mavenのリポジトリよりダウンロードできるので、core-*.*.*.jar と javase-*.*.*.jar をダウンロードしてクラスパスに追加してください。

https://repo1.maven.org/maven2/com/google/zxing/core/3.4.0/core-3.4.0.jar

https://repo1.maven.org/maven2/com/google/zxing/javase/3.4.0/javase-3.4.0.jar

Mavenを使用する場合は、pom.xmlに以下の定義を追加してください。

pom.xml

<!-- https://mvnrepository.com/artifact/com.google.zxing/core -->
<dependency>
    <groupId>com.google.zxing</groupId>
    <artifactId>core</artifactId>
    <version>3.4.0</version>
</dependency>

<!-- https://mvnrepository.com/artifact/com.google.zxing/javase -->
<dependency>
    <groupId>com.google.zxing</groupId>
    <artifactId>javase</artifactId>
    <version>3.4.0</version>
</dependency>

サンプルソース

基本

生成処理

以下のソースはAztecWriterを使って、URL「http://develman.net」をQRコードにエンコードして、「aztec.png」という画像ファイルに出力するサンプルです。以降の生成処理の解説のベースとしています。

Java

package net.develman.barcode;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.aztec.AztecWriter;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class ZxingAztecWriterExample {

    public static final void main(String[] args) {
        String content = "https://develman.net";
        int width = 200;
        int height = 200;
        String output = "aztec.png";

        try {
            AztecWriter writer = new AztecWriter();

            //AztecWriter#encode()には以下の情報を渡す
            // (1)エンコード対象の文字列、バーコードに埋め込みたい情報
            // (2)出力するバーコードの書式
            // (3)イメージの幅
            // (4)イメージの高さ
            BitMatrix bitMatrix = writer.encode(content, BarcodeFormat.AZTEC, width, height);

            BufferedImage image = MatrixToImageWriter.toBufferedImage(bitMatrix);

            //エンコードで得られたイメージを画像ファイルに出力する
            ImageIO.write(image, "png", new File(output));

        } catch (IOException e) {
            System.err.println("[" + output + "] を出力するときに例外が発生.");
            e.printStackTrace();
        }
    }
}

上のコードを実行すると画像ファイルとして得ることができます。

読み取り処理

以下のソースはAztecReaderを使って、「aztec.png」という画像ファイルをデコードしてURL「http://develman.net」を読み取るサンプルです。

Java

package net.develman.barcode;

import com.google.zxing.*;
import com.google.zxing.aztec.AztecReader;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.common.HybridBinarizer;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class ZxingAztecReaderExample {

    public static final void main(String[] args) {
        String input = "aztec.png";

        try {
            //画像データを読み込む
            BufferedImage image = ImageIO.read(new File(input));
            LuminanceSource source = new BufferedImageLuminanceSource(image);
            Binarizer binarizer = new HybridBinarizer(source);
            BinaryBitmap bitmap = new BinaryBitmap(binarizer);

            AztecReader reader = new AztecReader();

            //AztecReader#decode()には以下の情報を渡す
            // (1)読み込んだイメージ
            Result result = reader.decode(bitmap);

            System.out.println(result.getText());

        } catch (NotFoundException e) {
            System.err.println("[" + input + "] イメージの中にバーコードが見つからないためデコードで例外が発生.");
            e.printStackTrace();
        } catch (FormatException e) {
            System.err.println("[" + input + "] は書式不正のためデコードで例外が発生.");
            e.printStackTrace();
        } catch (IOException e) {
            System.err.println("[" + input + "] を読み込むときに例外が発生.");
            e.printStackTrace();
        }
    }
}

実行結果

https://develman.net

エラー訂正率を指定する

encode時にエンコードヒントを指定します。

Aztecコードはエラー訂正率1%(最低)から99%(最高)がサポートされています。エラー訂正率はデータレイヤ内に含まれるチェックキャラクタの比率です。デフォルトは23%+3キャラクタですが、正方形にならない場合は自動で補充されます。

生成処理

Java

String content = "https://develman.net";

Hashtable hints = new Hashtable();
hints.put(EncodeHintType.ERROR_CORRECTION, 99);

AztecWriter writer = new AztecWriter();
BitMatrix bitMatrix = writer.encode(content, BarcodeFormat.AZTEC, 200, 200, hints);
BufferedImage image = MatrixToImageWriter.toBufferedImage(bitMatrix);
ImageIO.write(image, "png", new File("aztec.png"));

EncodeHintType.ERROR_CORRECTIONに数値を指定することで指定のエラー訂正率で生成されます。

Aztec エラー訂正低エラー訂正率1%の例
Aztec エラー訂正高エラー訂正率99%の例

データレイヤーを指定する

encode時にエンコードヒントを指定します。
コンパクト版のAztecコードには1~4つのデータレイヤーがあり、完全版のAztec コードには1〜32のデータレイヤーがあります。通常は自動(最小)で問題ありません。格納するデータ長によらずシンボルのサイズを固定する場合は使用してください。

生成処理

Java

String content = "https://develman.net";

Hashtable hints = new Hashtable();
hints.put(EncodeHintType.AZTEC_LAYERS, 32);

AztecWriter writer = new AztecWriter();
BitMatrix bitMatrix = writer.encode(content, BarcodeFormat.AZTEC, 200, 200, hints);
BufferedImage image = MatrixToImageWriter.toBufferedImage(bitMatrix);
ImageIO.write(image, "png", new File("aztec2.png"));

EncodeHintType.AZTEC_LAYERSに数値を指定することでデータレイヤー数を手動で設定できます。コンパクト版は負数(-1〜-4)で、完全版は正数(1〜32)で指定します。デフォルトは0で、レイヤー数は最小となります。

Aztec コンパクトレイヤー-2を指定した例
Aztec レイヤー数最大32を指定した例

データレイヤー数を指定する場合、指定するレイヤー数ではデータを格納しきれない場合にエラーとなります。
java.lang.IllegalArgumentException: Data to large for user specified layer

ABOUT ME
sasakiyu
ひ弱で優しい少年だったが、デーモンと合体。 強大な力を得つつも人間の心を失わないデベルマンとなる。